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

时间:2014-07-23 11:15:32

标签: signalr signalr-hub

是否有为集线器功能定义和添加方法过滤器(如mvc中的ActionFilters) 我的意思是这样的:

public class MyHub : Hub 
{

    [Log]
    public string RegisterUser(UserModel model){
        ...
    }
}

我可以在 LogAttribute 实现中进行控制。

1 个答案:

答案 0 :(得分:13)

您应该能够使用SignalR's Hub pipeline在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); 
    }
}

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

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

    return base.OnBeforeIncoming(context); 
}

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

public void Configuration(IAppBuilder app) 
{ 
    GlobalHost.HubPipeline.AddModule(new LoggingPipelineModule()); 
    app.MapSignalR();
}