个人资料

跳过导航链接首页 > 博客列表 > 博客正文

SignalR教程17-使用.Net客户端连接signalr

:

SignalR不但支持网页的js进行连接,同时也支持.net客户端,例如应用商店 (WinRT), WPF, Silverlight, 或者控制台程序进行连接。连接的步骤如下:

安装SignalR客户端支持

首先通过Nuget安装SignalR客户端插件Microsoft.AspNet.SignalR.Client,注意不是Microsoft.AspNet.SignalR

进行连接

假设服务器上存在下面的代码

public class ChatHub : Hub
{
        public void Send(string name, string message)
        {
            //多人聊天功能
            Clients.All.broadcastMessage(name, message);
        }
...
}

那么进行连接的代码如下:

var hubConnection = new HubConnection("http://www.songshizhao.com/");
IHubProxy chatHubProxy = hubConnection.CreateHubProxy("ChatHub");
await hubConnection.Start();
chatHubProxy.Invoke("Send", ".Net client", "hello signalr!");

首先连接地址使用的是默认的/signalr地址(只需写入主域,/signalr不需填写),在js客户端上调用连接的start方法必须先注册一个服务器可以调用的事件,而.net客户端则不用这样做,找到hub代理后可以直接连接,连接的start方法是异步的,因此加入await等待连接完成再调用服务器方法。如果不加入await就直接调用服务器方法,会报错:连接尚未完成,调用服务器方法很简单,invoke方法先是方法名,然后是参数。例子中连接完成后直接调用服务器方法,目的是测试连接是否有效。

注册服务器可执行的本地方法

假设服务器上调用一个reportscore方法

public void SendScore(string name, int score)
{
    //多人聊天功能
    Clients.All.ReportScore(name, score);
}

在本地关联方式如下:

var hubConnection = new HubConnection("http://www.songshizhao.com/");
IHubProxy chatHubProxy = hubConnection.CreateHubProxy("ChatHub");
chatHubProxy.On<string,int>("ReportScore", (name,score) => MessageBox.Show(name + score.ToString()+"!!!"));
await hubConnection.Start();

上面例子中,客户端方法有两个参数类型string、int,对于复合参数(如类)的同样适用。上面是使用了lambda表达式简化了写法,为方便理解又可以有如下写法:

public async void TestConnectSignalrAsync()
{
    var hubConnection = new HubConnection("http://www.songshizhao.com/");
    IHubProxy chatHubProxy = hubConnection.CreateHubProxy("ChatHub");
    Action<string, int> Delegate= LocalMethod;
    chatHubProxy.On("ReportScore", Delegate);
    await hubConnection.Start();
    //chatHubProxy.Invoke("Send", ".Net client", "hello signalr!");
 
}
 
 
public void LocalMethod(string name,int score)
{
    MessageBox.Show(name+score);
}



songshizhao
最初发表2017/11/19 2:02:16 最近更新2017/11/19 2:02:16 6485
为此篇作品打分
10