SignalR框架的方法返回值及异常捕获

方法返回值

Hub 的方法支持异步,方法声明为async Task就可以了。如果Hub 中调用了异步的方法,那么一定要写成async。不能用TestAsync().Result 这种写法,否则Hub 方法只能调用一次就卡住了,后续调用就没反应了,不要使用WebClient 的异步,都换用HttpClient

Hub服务端

using Microsoft.AspNet.SignalR;

namespace SignalRApp
{
    public class MyResult
    {
        public int code { get; set; }
        public string msg { get; set; }
    }
    public class MyHub : Hub
    {
        public MyResult SendMsg()
        {
            var userName = Context.QueryString["userName"];
            var password = Context.QueryString["password"];

            MyResult r = null;
            if (userName == "admin" && password == "123456")
            {
                //在服务端端中,我们自定义个onSendMessage事件,这个事件就是向客户端发送一个“大家好”
                Clients.All.onSendMessage("大家好");

                r = new MyResult() { code = 200, msg = "调用成功" };
            }
            else
            {
                r = new MyResult() { code = 400, msg = "调用失败" };
            }

            return r;
        }
    }
}

浏览器客户端





    
    Index
    
    
    


    

SignalR框架的方法返回值及异常捕获_第1张图片

SignalR框架的方法返回值及异常捕获_第2张图片

异常捕获

Hub 的方法中如果发生异常, 可以在fail() 回调方法中得知:hub.test().done(function(){alert(“成功”);}).fail(function(){alert(“错误);});
虽然SignalR 是在ASP.Net 项目中运行的,但是Hub 中的未处理异常是不会被MVC 的,ExceptionFilter 截获的。在服务器端可以通过自定义HubPipelineModule 来在服务器端捕获未处理异常,然后记录到日志等:

1>首先编写类继承自HubPipelineModule

public class ExceptionHubPipelineModule : HubPipelineModule
{
    protected override void OnIncomingError(ExceptionContext exceptionContext,
    IHubIncomingInvokerContext invokerContext)
    {
        //exceptionContext.Error; 就是异常对象可以记录到日志中
    }
}

2>在Global 的Application_Start() 中编写GlobalHost.HubPipeline.AddModule(new ExceptionHubPipelineModule ());

namespace SignalRApp
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            //编写以下代码:
            GlobalHost.HubPipeline.AddModule(new ExceptionHubPipelineModule());
        }
    }
}

3>像上面讲的,未处理异常可以在客户端每个方法的fail 中得知,如果想统一在客户端得知异常,那么可以在浏览器端写一个function,然后在服务器端调用这个function。比如浏览器端start 之前写一个





    
    Index
    
    
    


    

然后ExceptionHubPipelineModule 中写

namespace SignalRApp
{
    public class ExceptionHubPipelineModule: HubPipelineModule
    {
        /// 
        /// 捕获Hub的客户端
        /// 
        /// exceptionContext里面有异常消息
        /// 
        protected override void OnIncomingError(ExceptionContext exceptionContext, IHubIncomingInvokerContext invokerContext)
        {

            //base.OnIncomingError(exceptionContext, invokerContext);
            //todo:将错误记录到Log4Net,或者分布式日记服务器

            //所有连接的客户端
            dynamic caller = invokerContext.Hub.Clients.Caller;
            //自定义一个onGlobalServerError方法,将异常信息发送到客户端(一般情况下不需要把异常消息告诉客户端,只要告诉客户端出错消息编号就好了,这里仅仅是演示)
            caller.onGlobalServerError(exceptionContext.Error.Message);
            
        }
    }
}

 

你可能感兴趣的:(SignalR框架)