Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何捕获Web API 2中的所有异常?_C#_Asp.net_Asp.net Web Api2 - Fatal编程技术网

C# 如何捕获Web API 2中的所有异常?

C# 如何捕获Web API 2中的所有异常?,c#,asp.net,asp.net-web-api2,C#,Asp.net,Asp.net Web Api2,我正在用WebAPI编写一个RESTfulAPI,我不知道如何有效地处理错误。我希望API返回JSON,并且每次都需要由完全相同的格式组成——即使出现错误也是如此。下面是几个成功和失败响应的示例 成功: { Status: 0, Message: "Success", Data: {...} } 错误: { Status: 1, Message: "An error occurred!", Data: null } 如果存在异常——任何异常,我

我正在用WebAPI编写一个RESTfulAPI,我不知道如何有效地处理错误。我希望API返回JSON,并且每次都需要由完全相同的格式组成——即使出现错误也是如此。下面是几个成功和失败响应的示例

成功:

{
    Status: 0,
    Message: "Success",
    Data: {...}
}
错误:

{
    Status: 1,
    Message: "An error occurred!",
    Data: null
}

如果存在异常——任何异常,我想返回一个类似于第二个异常的响应。要做到这一点,最简单的方法是什么,这样就不会有任何异常未经处理?

实现
IEExceptionHandler

比如:

 public class APIErrorHandler : IExceptionHandler
 {
     public Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)
     {
         var customObject = new CustomObject
             {
                 Message = new { Message = context.Exception.Message }, 
                 Status = ... // whatever,
                 Data = ... // whatever
             };

        //Necessary to return Json
        var jsonType = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
        json.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;    

        var response = context.Request.CreateResponse(HttpStatusCode.InternalServerError, customObject, jsonType);

        context.Result = new ResponseMessageResult(response);

        return Task.FromResult(0);
    }
}
在WebAPI的配置部分(
publicstaticvoidregister(HttpConfiguration-config)
)写下:


这种方法似乎将
内容类型
设置为
text/plain
,而不是
application/json
不,事实并非如此。只是在我自己的代码中检查了它,它不断返回
application/json
。有没有使用内容协商的方法来实现这一点?我必须向自定义错误响应对象添加System.Runtime.Serialization属性以获取XML。如果没有属性,web api将返回json。@Ofer Zelig这些更改将在CreateResponse中传递JsonType,然后返回“内容类型应用程序/json”,而不是“内容类型文本/plain”。我在默认的WebAPI2配置中进行了测试。
config.Services.Replace(typeof(IExceptionHandler), new APIErrorHandler());