CORS, Autofac и промежуточное ПО для обработки исключений в Owin, какое из них будет первым?

У меня есть установка 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

person BlackTigerX    schedule 02.02.2018    source источник


Ответы (1)


Я думаю, что когда в документации говорится «Сначала зарегистрируйте промежуточное ПО Autofac», это происходит в контексте указания правильного порядка между следующими тремя компонентами: 1) промежуточное ПО Autofac, 2) промежуточное ПО Autofac Web API и 3) стандартное промежуточное ПО Web API.

CORS не входит в этот список, и его следует настроить в первую очередь: вы должны вызвать .UseCors перед вызовом .UseWebApi или любого другого промежуточного программного обеспечения, использующего запросы. Любой запрос, управляемый любым промежуточным программным обеспечением, должен включать заголовки CORS Access-Control, иначе вы можете получить ошибки доступа из разных источников. Я думаю, это относится и к вашему промежуточному программному обеспечению для обработки ошибок. Поэтому его следует настраивать после CORS (но перед другими компонентами промежуточного программного обеспечения, если вы хотите обрабатывать их исключения).

Дополнительные сведения о CORS и веб-API см. на этой странице. Подробнее о деталях CORS здесь.

Фактически, точный комментарий к документации Autofac точно говорит: «СНАЧАЛА зарегистрируйте промежуточное ПО Autofac, затем промежуточное ПО Autofac Web API и, наконец, стандартное промежуточное ПО Web API». В примере кода в этой документации у них есть стандартный код настройки веб-API, а затем настройка веб-API OWIN (это раздел, в котором применяется этот «Первый»).

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

Страница документа, на которой я получил пример кода, находится здесь (думаю, это то же самое, что вы проверили).

person Diana    schedule 13.02.2018