Как использовать ответы «детализация проблемы» для необработанных исключений? - PullRequest
0 голосов
/ 22 марта 2019

Как подтверждено , ProblemDetails (на основе спецификации RFC 7807) - это стандартный ответ для клиентских кодов ошибок в ASP.NET Core 2.2.Это прекрасно работает, когда я возвращаю такие вещи, как NotFound() в методах действия моего контроллера API.

Но как мне настроить мой проект Web API, чтобы он также использовал ProblemDetails для необработанных исключений (ответы «500 Internal Server Error»))?По умолчанию такие необработанные исключения либо возвращают тело HTML (когда был вызван UseDeveloperExceptionPage() или UseExceptionHandler(somePath)), либо тело нет (если не был вызван ни один метод).

Мое предпочтительное решение всегда будет возвращать объект ProblemDetailsкогда исключение происходит в контроллерах API, но все же возвращает HTML-страницы для исключений на других (связанных с просмотром) контроллерах.В режиме разработки объект ProblemDetails должен иметь полную информацию об исключении, в производстве - только очень ограниченную информацию.Это возможно?

1 Ответ

1 голос
/ 25 марта 2019

Похоже, что ProblemDetails не поддерживает исключение 404 и 500. Обходное решение - установить Hellang.Middleware.ProblemDetails package`,

Install-Package Hellang.Middleware.ProblemDetails

и затем настроить в файле startup.csустановите IncludeExceptionDetails на ture только в среде разработки.

public class Startup
{
    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        Configuration = configuration;
        CurrentEnvironment = env;
    }

    public IConfiguration Configuration { get; }
    public IHostingEnvironment CurrentEnvironment { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddProblemDetails(setup=> {

            setup.IncludeExceptionDetails = _ => CurrentEnvironment.IsDevelopment();
        });
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app)
    {           
        app.UseProblemDetails();           
        //...
    }
}

См. здесь .

...