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);
}