页面代码
<script src="~/Scripts/jquery-1.11.1.min.js"></script>
<script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>
<script src="http://localhost:7754/signalr/hubs"></script>
<div>
<div>服务器消息:</div>
<div id="serverMsg" style="border:1px solid #a0a0a0;height:400px;width:400px;overflow-y:auto;"></div>
</div>
</div>
<script type="text/javascript">
var trade;
var tradeList = Array();
$(document).ready(function () {
$.connection.hub.url = "http://localhost:7754/signalr";
trade = $.connection.tradeHub;
//接受服务器消息
trade.client.addMsg = function (message) {
if (message != "") {
console.log(message);
}
};
//推送跨域设置xdomain
$.connection.hub.start({ xdomain: true }).done(function () {
console.log("连接成功, transport = " + $.connection.hub.transport.name);
});
});
</script>
using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
namespace SignalRPush.Hubs
{
public class TradeHub : Hub
{
public void Send(string message)
{
//廣播推送addMsg是客服端的js接收方法,名稱要一致
Clients.All.addMsg(message);
}
此控制器是用于接收外部的请求,然后把消息推送出去,方便外部项目调用
using Microsoft.AspNet.SignalR;
using SignalRPush.Hubs;
using System;
using System.Web.Mvc;
namespace SignalRPush.Controllers
{
public class ReceiveController : Controller
{
public string GetMsg(string msg)
{
int code = 0;
string bkMsg = "推送失败";
try
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<TradeHub>();
context.Clients.All.addMsg(msg);
code = 1;
bkMsg = "推送成功";
}
catch (Exception ex)
{
code = 0;
bkMsg = "推送失败";
if (ex.InnerException!=null)
{
LogHepler.AddLog("400", ex.InnerException.Message);
}else
{
LogHepler.AddLog("400", ex.Message);
}
}
var obj = new { code = code, msg = bkMsg };
string backMsg = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
return backMsg;
}
}
}
登錄將userid存入微軟自帶的Forms認證裡面
/// <summary>
/// 登录
/// </summary>
/// <param name="userId"></param>
/// <param name="isKeepLogin">是否保持登录</param>
public static void LogIn(long userId, bool isKeepLogin)
{
//将userId加密
string userIdEncrypt = SecurityHelper.AESEncrypt(userId.ToString(), ConfigKey.siteUserKey);
FormsAuthentication.SetAuthCookie(userIdEncrypt, isKeepLogin);
}
//繼承IUserIdProvider,實現方法設置userid
using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Transaction.Site.Hubs
{
/// <summary>
/// SignalR获取用户id
/// </summary>
public class MyUserIdProvider : IUserIdProvider
{
public string GetUserId(IRequest request)
{
string userId = request.GetHttpContext().User.Identity.Name;
userId = FrameWork.Common.SecurityHelper.AESDecrypt(userId, FrameWork.Common.ConfigKey.siteUserKey);
return userId;
}
}
}
//註冊類MyUserIdProvider
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//为signrl注入
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => new MyUserIdProvider());
}
}
在项目上添加类Startup.cs,跨域支持需要引用Microsoft.Owin.Cors组件
using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRPush.Startup))]
namespace SignalRPush
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
//设置跨域支持
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
app.MapSignalR();
}
}
}
集線器
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using Transaction.Entity;
using Transaction.IBLL;
namespace Transaction.Site.Hubs
{
//集線器
public class TradeHub : Hub
{
/// <summary>
/// 发送数据到页面
/// </summary>
/// <param name="message"></param>
public void Send(string message)
{
if (!string.IsNullOrEmpty(message) && !string.IsNullOrWhiteSpace(message))
{
Clients.All.addMsg(message);
}
}
}
}
推送消息到瀏覽器客戶端
private void TradingCancelHK(RedisChannel channel, object value)
{
//{"type":0,"orderId":1140,"orderNo":2017110711430116,"userId":101,"status":1,"msg":""}
Task.Factory.StartNew(() =>
{
string json = value.ToString().Replace("'", "\"");
string msg = string.Format("hk撤销:{0}", json);
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<TradeHub>();
//根据订单id查询userid
dynamic backInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(json);
backInfo.pushType = 4;//1=网站顶部价格变动消息,3是bb撤销类型消息,4是人民币撤销消息
string userId = backInfo.userId;//用户id
string bkJson = Newtonsoft.Json.JsonConvert.SerializeObject(backInfo);
//推送消息到客戶端
context.Clients.User(userId).addMsg(bkJson);
});
}