SignalR推送服务,自定義連接id為用戶id

46 篇文章 1 订阅
8 篇文章 0 订阅

页面代码

<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);
	});
}		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王焜棟琦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值