我有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);
我认为在我的理解中肯定存在一些很大的逻辑差距,因为必须有一种逻辑方式来结束中间件链
答案 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);
}
}
}