我有一个owin设置,在许多其他的东西,使用CORS和Autofac。 Autofac文档说“首先注册Autofac中间件。”,很多人说app.UseCors应该是第一件事。
我还有一个异常处理中间件,许多人也说这应该是第一件事,以便“其他中间件(在堆栈跟踪下)将传播并被此中间件的try / catch块捕获。”,和这个很有意义,因为实现看起来像:
try
{
await Next.Invoke(context);
}
catch...
哪一个应该是第一个? 这3个中间件组件的正确顺序是什么
我当前的启动配置如下所示:
public void Configuration(IAppBuilder app) {
// Add WebApi CORS handling to the OWIN pipeline
app.UseCors(CorsOptions.AllowAll);
// Create and register Owin HttpConfig instance
var config = new HttpConfiguration
{
IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always // Enable error details in http responses
};
// Register the Autofac middleware FIRST. This also adds Autofac-injected middleware
// registered with the container.
var container = AutofacConfig.ConfigureContainer(config);
app.UseAutofacMiddleware(container);
app.UseAutofacWebApi(config);
app.UseNLog();
// Handle exceptions from OWIN middleware components globally
app.UseExceptionHandling();
app.UseOAuth(config);
//... quite a bit more stuff after
答案 0 :(得分:0)
我认为当文档说“#34;注册Autofac中间件第一个"它是在以下三个组件之间陈述正确顺序的上下文中:1)Autofac中间件,2)Autofac Web API中间件,以及3)标准Web API中间件。
CORS不是此列表的一部分,应首先进行配置:在调用.UseCors
或使用请求的任何其他中间件之前,必须先调用.UseWebApi
。任何中间件管理的任何请求都应包含CORS Access-Control标头,否则您可能会遇到跨源访问错误。我想这也适用于您的错误处理中间件。所以它应该在CORS之后配置(但在其他中间件组件之前,如果你想处理它们的异常)。
有关this page中CORS和Web API的更多信息。有关CORS详细信息here。
的更多信息事实上,确切的Autofac文档评论准确地说明了#14;注册Autofac中间件FIRST,然后是Autofac Web API中间件,最后是标准的Web API中间件"。在该文档的代码示例中,他们具有标准的web api设置代码,之后是OWIN web api设置(这是" First"适用的部分)。
public class Startup
{
public void Configuration(IAppBuilder app)
{
var builder = new ContainerBuilder();
// STANDARD WEB API SETUP:
// Get your HttpConfiguration. In OWIN, you'll create one
// rather than using GlobalConfiguration.
var config = new HttpConfiguration();
// Register your Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// Run other optional steps, like registering filters,
// per-controller-type services, etc., then set the dependency resolver
// to be Autofac.
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
// OWIN WEB API SETUP:
// Register the Autofac middleware FIRST, then the Autofac Web API middleware,
// and finally the standard Web API middleware.
app.UseAutofacMiddleware(container);
app.UseAutofacWebApi(config);
app.UseWebApi(config);
}
}
我获得代码示例的文档页面是here(我猜它与您检查的相同)。