Неверный код HttpStatus для ядра ASP.NET

Вам нужно будет создать CLR-процедуру, которая предоставляет функции регулярного выражения, как показано в этой статье .

0
задан Sergio 13 July 2018 в 10:21
поделиться

1 ответ

Вероятно, вы получили свое промежуточное программное обеспечение, зарегистрированное в неправильном месте в конвейере. Порядок, в котором вы размещаете свое промежуточное ПО в startup.cs, имеет значение. Например:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        try
        {
            await next();
        }
        catch (Exception ex)
        {
            context.Response.StatusCode = StatusCodes.Status403Forbidden;

            await context.Response.WriteAsync(ex.Message);
        }
    });

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

В приведенном выше коде я зарегистрировал промежуточное программное обеспечение, подобное вашему в начале конвейера. ASP.NET Core обрабатывает любые запросы в том порядке, в котором вы их размещаете, поэтому мое собственное промежуточное программное обеспечение будет запускаться сначала для запроса. Однако ответы обрабатываются снизу вверх. Итак, в примере, когда исключение выбрасывается в контроллер (или где угодно), UseDeveloperExceptionPage или UseExceptionHandler сначала получат какое-либо исключение, обработайте его и измените код состояния на 500.

Если мы изменим порядок на это:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.Use(async (context, next) =>
    {
        try
        {
            await next();
        }
        catch (Exception ex)
        {
            context.Response.StatusCode = StatusCodes.Status403Forbidden;

            await context.Response.WriteAsync(ex.Message);
        }
    });

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseMvc();
}

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

0
ответ дан Simply Ged 17 August 2018 в 13:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: