如何在OWIN中间件

时间:2017-09-08 12:45:32

标签: katana

我有3个中间件类成功执行,直到没有更多的中间件类。在调用中间件类之后,我不再需要将请求传递给路由器。

这样做的最佳方式是什么?

例如,我有这段代码:

// Register middleware. Order is important!
app.Use<Authentication>();
app.Use<Logging>();
app.Use<Example>(configExample);

这可以正常工作。每个请求首先Authentication运行,然后Logging,然后Example

我可以看到,在启动程序时,这些app.Use<>()行通过传入委托来实例化适当的中间件。该委托包含一个属性Target,它指向要运行的下一个中间件类。由于显而易见的原因,传递给Example类的委托是空的(因为它是链中的最后一个中间件类)。

如果不改变最后一个链接的中间件类中的代码(我不想让命令变得重要),我该如何调用路由器?我的路由器看起来像这样:

HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
    ...
);
config.Routes.MapHttpRoute(
    ...
);
etc.
app.UseWebApi(config);

我认为在我的理解中肯定存在一些很大的逻辑差距,因为必须有一种逻辑方式来结束中间件链

1 个答案:

答案 0 :(得分:0)

答案是,当没有更多中间件时,中间件会自动传递给控制器​​。但是我正在使用的教程在中间件中使用了阻止这种情况的代码行。

我已经按照指示在这里创建中间件: https://www.codeproject.com/Articles/864725/ASP-NET-Understanding-OWIN-Katana-and-the-Middlewa

这两行:

IOwinContext context = new OwinContext(environment);
await context.Response.WriteAsync("<h1>Hello from Example " + _configExample + "</h1>");

导致控制器的响应被截断(或某事)。这是代码:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Avesta.ASP.Middleware
{
    using AppFunc = Func<IDictionary<string, object>, Task>;

    public class Example
    {
        AppFunc _next;
        string _configExample;

        public Example(AppFunc next, string configExample)
        {
            _next = next;
            _configExample = configExample;
        }

        public async Task Invoke(IDictionary<string, object> env)
        {
            //IOwinContext context = new OwinContext(environment);
            //await context.Response.WriteAsync("<h1>Hello from Example " + _configExample + "</h1>");
            await _next.Invoke(env);
        }
    }
}