OWIN中间件后如何使用IAppBuilder.UseWebApi

How to use IAppBuilder.UseWebApi after OWIN middleware

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

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

比如我有这个代码:

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

这相当于 expected.On 每个请求首先 Authentication 运行,然后 Logging,然后 Example

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

在不更改最后链接的中间件 class 中的代码的情况下(我不希望顺序很重要),如何调用路由器?我的路由器看起来像这样:

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

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

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

我在这里遵循了创建中间件的巧妙方法的说明: 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);
        }
    }
}