向hub方法添加一些过滤器(如MVC中的AcctionFilters)

Mah*_*vej 7 signalr signalr-hub

无论如何为hub功能定义和添加方法过滤器(如mvc中的ActionFilters)我的意思是这样的:

public class MyHub : Hub 
{

    [Log]
    public string RegisterUser(UserModel model){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以在LogAttribute实现中做一些控制.

hal*_*r73 13

您应该能够通过使用SignalR的Hub管道在ASP.NET MVC中实现与动作过滤器类似的功能:

public class LoggingPipelineModule : HubPipelineModule 
{ 
    protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context) 
    {
        Debug.WriteLine("Invoking '{0}.{1}({2})'.",
            context.MethodDescriptor.Hub.Name,
            context.MethodDescriptor.Name,
            string.Join(", ", context.Args));

        return base.OnBeforeIncoming(context); 
    }

    protected override object OnAfterIncoming(object result, IHubIncomingInvokerContext context)
    {
        Debug.WriteLine("Finished Invoking '{0}.{1}'. Returned '{2}'.",
            context.MethodDescriptor.Hub.Name,
            context.MethodDescriptor.Name,
            result);

        return base.OnAfterIncoming(result, context); 
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您只想记录附加了自定义属性的方法,则可以在记录之前检查自定义属性:

protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context) 
{
    if (context.MethodDescriptor.Attributes.OfType<MyAttribute>().Any())
    {
        // Log here.
    }

    return base.OnBeforeIncoming(context); 
}
Run Code Online (Sandbox Code Playgroud)

您可以在致电之前注册您的模块MapSignalR:

public void Configuration(IAppBuilder app) 
{ 
    GlobalHost.HubPipeline.AddModule(new LoggingPipelineModule()); 
    app.MapSignalR();
}
Run Code Online (Sandbox Code Playgroud)