【问题标题】:Start / stop OWIN middlewares?启动/停止 OWIN 中间件?
【发布时间】:2014-04-21 21:12:02
【问题描述】:

我想知道是否可以根据条件/事件启动/停止单个 OWIN 中间件?

假设我在 OWIN 上同时托管 Web API 2 和 SignalR,例如提供有关网络设备的信息,并在客户离线/在线时立即通知客户。在某些场景中,比如说“维护”模式,Web API 2 不应该可用,但我仍然需要通知客户某个事件。所以我需要阻止 Web API 2 响应请求(例如,使用“不可用”、“查看其他”...)但 SignalR 应该仍然可用。

在不重新启动整个 Web 应用上下文的情况下是否可以这样做?

【问题讨论】:

    标签: c# asp.net-web-api signalr owin asp.net-web-api2


    【解决方案1】:

    我认为您可以通过多种方式解决此问题。如果您需要做的只是在某个时间窗口内从 ASP.NET Web API 发送“不可用”,您可以简单地在 ASP.NET Web API 管道中拥有一个消息处理程序,在此时间窗口内唤醒并短路执行所有请求并发送响应。如果您只希望 ASP.NET Web API 行为在停机期间有所不同,则可以查看此选项。

    如果您希望更改多个框架的行为,您可以考虑让单个总体 OWIN 中间件在一个地方执行此操作,正如 Brock 所建议的那样。

    另外,如果你想要更多的控制,你也可以看看MapWhen扩展,它可以用于有条件地将中间件插入到管道中。

    app.MapWhen(context =>
    {
        // check the condition and return true or false
    },
    trueApp =>
    {
        // Run middleware here like this using trueApp
        // trueApp.Run or trueApp.Use
    });
    

    【讨论】:

    • MapWhen 操作中动态注册中间件是否有任何性能影响?通常,您会在 Owin 启动中的 Configuration 方法中调用类似 app.UseWebApi(config) 的东西,这只会在主机启动 Web 应用程序时发生。在MapWhen 内部调用它会为每个满足给定条件的请求注册中间件。
    【解决方案2】:

    您必须根据您的自定义条件将中间件编码为 nop。

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多