2017-10-04 99 views
0

在我的webapi項目中我有一個全局異常處理程序,我想在未捕獲到異常時設置狀態代碼500,並且我想設置自定義消息,但我不知道如何設置該消息。這裏是我的代碼:webapi:在全局異常處理程序中設置消息

public class MyExceptionHandler : IExceptionHandler 
{ 
    public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) 
    { 
     context.Result = new StatusCodeResult(HttpStatusCode.InternalServerError, context.Request); 

     return Task.FromResult<object>(null); 
    } 
} 

和配置是:

 config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.LocalOnly; 

     config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler()); 

在郵遞員響應主體是空的,我只看到500錯誤代碼。那麼如何在這裏設置消息?

+0

這將幫助您使用此解決方案配置客戶錯誤消息http://www.dotnetcurry.com/aspnet/1133/aspnet-web-api-throw-custom-exception-message –

回答

0

下面是一個例子:

public class ExceptionFilter : ExceptionFilterAttribute 
{ 
    private TelemetryClient TelemetryClient { get; } 

    public ExceptionFilter(TelemetryClient telemetryClient) 
    { 
     TelemetryClient = telemetryClient; 
    } 

    public override void OnException(ExceptionContext context) 
    { 
     context.ExceptionHandled = true; 
     context.HttpContext.Response.Clear(); 
     context.HttpContext.Response.StatusCode = (int) HttpStatusCode.InternalServerError; 
     context.Result = new JsonResult(new 
     { 
      error = context.Exception.Message 
     }); 

     TelemetryClient.TrackException(context.Exception); 
    } 
} 

,你可以在你的啓動使用它 - ConfigureService:

services.AddSingleton<ExceptionFilter>(); 
services.AddMvc(
       options => { options.Filters.Add(services.BuildServiceProvider().GetService<ExceptionFilter>()); }); 

它現在也可以發送異常蔚藍遙測。

可以offcourse刪除telemetryclient和方法:)

喝彩!

+0

,如果我有10個控制器,每個控制器都有它自己的異常類型,我需要添加10個過濾器...所以使用異常處理程序類不可能這樣做? –

+0

@BudaGavril,你爲什麼需要這個? 'context.Exception'包含每個控制器可能拋出的異常。 –

+0

請參閱上面的註釋...以便在添加新控制器和異常類型時,此異常由我的異常處理程序處理,而無需添加新過濾器或編輯一個現有的過濾器 –