【问题标题】:OWIN Stop Processing Based on Condition?OWIN 根据条件停止处理?
【发布时间】:2013-09-28 17:40:34
【问题描述】:

我的 OWIN Startup 类中有以下代码:

myiapbuilder.Map("/something/something", doit =>
{
    doit.Use<pipepart1>();
    doit.Use<pipepart2>();
    doit.Use<piprpart3>();
});

如果在 pipepart1 中出现我不喜欢的情况,我想在该中间件中为调用者编写自定义文本/纯文本响应,并且不要触发 pipepart2 或 pipepart3。 CodePlex 上的 BranchingPipelines 示例显示了很多东西,但并非如此。

是否可以根据早期的中间件评估来缩短流程或以其他方式停止中间件的 OWIN 处理?

【问题讨论】:

    标签: http asp.net-web-api owin katana


    【解决方案1】:

    如果您打算直接从pipepart1 响应客户端,那么您可以避免调用管道中的其他中间件。下面是一个例子。这是你的想法吗?

    这里基于某些条件(在我的情况下,如果查询字符串具有特定的键),我决定要么直接响应客户端,要么调用下一个中间件。

    appBuilder.Map("/something/something", doit =>
    {
        doit.Use<Pipepart1>();
        doit.Use<Pipepart2>();
    });
    
    public class Pipepart1 : OwinMiddleware
    {
        public Pipepart1(OwinMiddleware next) : base(next) { }
    
        public override Task Invoke(IOwinContext context)
        {
            if (context.Request.Uri.Query.Contains("shortcircuit"))
            {
                return context.Response.WriteAsync("Hello from Pipepart1");
            }
    
            return Next.Invoke(context);
        }
    }
    
    public class Pipepart2 : OwinMiddleware
    {
        public Pipepart2(OwinMiddleware next) : base(next) { }
    
        public override Task Invoke(IOwinContext context)
        {
            return context.Response.WriteAsync("Hello from Pipepart2");
        }
    }
    

    【讨论】:

    • 超级酷。您知道无需启动 OWIN 主机运行时即可进行集成测试或单元测试的无摩擦方式吗?
    • Microsoft.Owin.Testing 包有一个 TestServer,许多人使用它来对 OWIN 应用程序进行单元测试。这是一个内存服务器,它接收 Action (您的配置方法)并运行 OWIN 服务器,而无需实际启动 http 侦听器,也无需接触线路。注意:虽然这仍处于预发布阶段。
    • var server = TestServer.Create(YourConfigMethod); var httpResponse = server.WithPath("/").SendAsync("GET") 是这个 TestServer 的一个示例用法。
    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 2015-05-23
    • 2017-06-21
    • 2018-04-22
    • 2014-04-21
    • 1970-01-01
    • 2016-03-07
    • 2015-06-07
    相关资源
    最近更新 更多