SignalR教程4-服务器端中调用客户端方法

使用Clients 属性调用客户端方法, .服务器调用所有的客户端上的addNewMessageToPage方法的例子如下:

服务器C#

public class ContosoChatHub : Hub
{
   public void NewContosoChatMessage(string name, string message)
   {
       Clients.All.addNewMessageToPage(name, message);
   }
}

其中addNewMessageToPage(name, message)方法在客户端上定义,在服务器上没有定义,服务器将会发送方法名和传递的参数给客户端,由客户端处理。

JavaScript客户端如下:       

contosoChatHubProxy.client.addNewMessageToPage = function (name, message) {
   // Add the message to the page.
   $('#discussion').append('<li><strong>' + htmlEncode(name)
       + '</strong>: ' + htmlEncode(message) + '<li>');
};

注意:服务器方法内参数不能直接指定数值; 语法类似于 int x =Clients.All.add(1,1)无效.参数可以规格复合类型和数组,下面的例子传递了一个复合的类型给客户端方法的参数。

服务器传递一个复合类型,例如

public void SendMessage(string name, string message)
{
   Clients.All.addContosoChatMessageToPage(new ContosoChatMessage() { UserName = name, Message = message });
}
其中类ContosoChatMessage的定义在服务器端,如下:
public class ContosoChatMessage
{
   public string UserName { get; set; }
   public string Message { get; set; }
}

JavaScript 客户端

var contosoChatHubProxy = $.connection.contosoChatHub;
contosoChatHubProxy.client.addMessageToPage = function (message) {
   console.log(message.UserName + ' ' + message.Message);
});

名称的匹配是不区分大小写的. 例如, 服务器上Clients.All.addContosoChatMessageToPage 将会执行客户端 AddContosoChatMessageToPage, addcontosochatmessagetopage, 或者 addContosoChatMessageToPage方法.

调用方法是异步执行的。 调用客户端之后的任何代码将立即执行,而不等待SignalR完成向客户端传输数据,除非指定后续代码行应等待方法完成。 以下代码示例演示如何顺序执行两个客户端方法。

public async Task NewContosoChatMessage(string name, string message)
{
    await Clients.Others.addContosoChatMessageToPage(data);
    Clients.Caller.notifyMessageSent();
}
如果使用await等到客户端方法在下一行代码执行之前完成,那并不意味着客户端将在下一行代码执行之前实际接收到消息。 客户端方法调用的“完成”只意味着SignalR已经完成了发送消息所需的一切。 如果您需要验证客户是否收到该消息,则必须自己编写该机制。

使用字符串变量作为方法名

如果想使用字符串作为方法名, cast Clients.All (or Clients.Others, Clients.Caller, etc.) 为 IClientProxy 然后Invoke(methodName, args...).

public void NewContosoChatMessage(string name, string message)
{
   string methodToCall = "addContosoChatMessageToPage";
   IClientProxy proxy = Clients.All;
   proxy.Invoke(methodToCall, name, message);
}





作者:songshizhao 发表于:2017-11-09T01:07:37 访问量:864
评论 [发表评论]