Nano Hash - криптовалюты, майнинг, программирование

Неверный код HttpStatus в ASP.NET Core

У меня есть промежуточное ПО Exception в приложении ASP.NET Core, которое делает это:

try
{
    await _next(httpContext);
}
catch (MyException exception)
{
    httpContext.Response.ContentType = "application/json";
    httpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;

    await httpContext.Response.WriteAsync(exception.Message);
}

В этом примере мы отправляем «Запрещено» (код состояния http 403), но я всегда получаю 500. Я проверяю это в Swagger и Google Chrome и не понимаю причины.


Ответы:


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

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

13.07.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..