Tips:
1、注意跟普通版Net.MVC的前端處理方式不一樣,以前可以connection.start()后直接done里面再做邏輯處理,現在不行了
建議做法是在具體的業務Hub里重寫OnConnectedAsync事件,來為當前連接ID做分組等處理
2、目前版本只支持了websocket協議,還不支持Comet長連接方式
后台代碼:
public class MessengerHub : Hub
{
private readonly IHttpContextAccessor _accessor;
public MessengerHub(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
//連上之后初始化Group
public override async Task OnConnectedAsync()
{
var connectionId = Context.ConnectionId;
var userInfo = _accessor.HttpContext.User.Identities.First(u => u.IsAuthenticated);
await Task.Run(() =>
{
this.Groups.AddAsync(Context.ConnectionId, _accessor.HttpContext.User.Identity.Name);
});
}
//給指定Group客戶端發送消息
public async Task SendToMessage(string sendTo, string title, string content, int duration = 3000)
{
var connectionId = Context.ConnectionId;
await Task.Run(() =>
{
sendTo.Split(',').ToList().ForEach(t =>
{
this.Clients.Group(t).InvokeAsync("SendToMessage", "", title, content, duration);
});
});
}
}
前端代碼需要引入signalr-client.js,可以在Bower包里添加或者在Github上找下
前端關鍵代碼:
//消息處理 let transportType = signalR.TransportType.WebSockets; let http = new signalR.HttpConnection(`http://${document.location.host}/messengerHub`, { transport: transportType }); let connection = new signalR.HubConnection(http); connection.start(); //setTimeout(connection.invoke('AddGroup'), 5000); connection.on('SendToMessage', (sendTo, title, content, duration) => { layer.open({ type: 1 , time: duration , title: title , offset: 'rb'//具體配置參考:http://www.layui.com/doc/modules/layer.html#offset //, id: 'LAY_demo_rb' //防止重復彈出 , content: '<div id="MessageTips">' + content + '</div>' }); });
注意這個地方注釋掉的connection.invoke('AddGroup'),這個地方不能在前台JS里面做分組初始化
前台JS現在也不支持Done方法回調,所以寫在了后台OnConnectedAsync方法里
客戶端發送方法跟以前的版本不一樣:connection.invoke('SendToMessage','Admin','標題','消息提示',2000);
