signalr
  1. signalr-signalrmiddleware

SignalR Middleware - SignalR Hub Pipeline

The SignalR Hub Pipeline provides a way to add middleware components to the SignalR communication channel. It allows you to intercept, modify, or monitor the traffic passing through the channel. This feature is commonly called SignalR Middleware.

Syntax

public class MyMiddleware : HubPipelineModule
{
    public override bool OnBeforeIncoming(IHubIncomingInvokerContext context)
    {
        //... logic
        return base.OnBeforeIncoming(context);
    }

    public override bool OnBeforeOutgoing(IHubOutgoingInvokerContext context)
    {
        //... logic
        return base.OnBeforeOutgoing(context);
    }
}

protected void Application_Start(object sender, EventArgs e)
{
    var pipeline = GlobalHost.HubPipeline;
    pipeline.AddModule(new MyMiddleware());
}

Example

//Set up a middleware that logs the incoming and outgoing messages
public class LoggingMiddleware : HubPipelineModule
{
    public override bool OnBeforeIncoming(IHubIncomingInvokerContext context)
    {
        var methodName = context.MethodDescriptor.Name;
        var args = JsonConvert.SerializeObject(context.Args);

        Console.WriteLine($"[LOGGING] Incoming message: {methodName}({args})");
        return base.OnBeforeIncoming(context);
    }

    public override bool OnBeforeOutgoing(IHubOutgoingInvokerContext context)
    {
        var result = JsonConvert.SerializeObject(context.InvocationResult);
        var methodName = context.Invocation.Method.Name;

        Console.WriteLine($"[LOGGING] Outgoing message: {methodName}({result})");
        return base.OnBeforeOutgoing(context);
    }
}

protected void Application_Start(object sender, EventArgs e)
{
    var pipeline = GlobalHost.HubPipeline;
    pipeline.AddModule(new LoggingMiddleware());
    //... other setup code
}

Output

[LOGGING] Incoming message: SendMessage({"sender":"alice","message":"hello!"})
[LOGGING] Outgoing message: SendMessage("success")

Explanation

In the example above, we implemented a logging middleware that intercepts any incoming or outgoing messages and logs the details to the Console. When a client invokes the "SendMessage" method on the SignalR Hub, the middleware will intercept the incoming message, log the method name and arguments, then pass the message along the pipeline. Similarly, when the Hub responds with a value, the middleware will intercept the outgoing message, log the result, then pass the message to the client.

Use

SignalR Middleware can be used for a wide variety of purposes, such as authentication, authorization, logging, performance monitoring, and many others. You can create custom middleware components that perform any required logic, then add them to the pipeline in the Global.asax file of the SignalR host application.

Important Points

  • SignalR Middleware is implemented as a HubPipelineModule class.
  • You can intercept incoming and/or outgoing messages using the OnBeforeIncoming and OnBeforeOutgoing methods, respectively.
  • The middleware should call the base method to pass the message along the pipeline.
  • SignalR middleware can be used for authentication, authorization, logging, and many other purposes.
  • Middleware components can be added to the pipeline in the Application_Start method of the Global.asax file.

Summary

SignalR Middleware is a powerful feature that allows you to add custom processing logic to the SignalR communication channel. By implementing custom middleware components, you can intercept, modify, or monitor the traffic passing through the pipeline. This feature is useful for many scenarios, such as authentication, authorization, logging, performance monitoring, and many others. To use SignalR Middleware, you need to create a HubPipelineModule class and add it to the pipeline in the Global.asax file of the SignalR host application.

Published on: