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);
}
}
}
我有 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);
}
}
}