OData(至少从 v3 开始)使用specific json 表示错误:
{
"error": {
"code": "A custom error code",
"message": {
"lang": "en-us",
"value": "A custom long message for the user."
},
"innererror": {
"trace": [...],
"context": {...}
}
}
}
Microsoft .Net 包含 Microsoft.Data.OData.ODataError 和 Microsoft.Data.OData.ODataInnerError 类以在服务器端形成 OData 错误。
要形成正确的 OData 错误响应 (HttpResponseMessage),其中包含错误详细信息,您可以:
1) 使用System.Web.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponse 方法在控制器的操作中形成并返回HttpResponseMessage
return Request.CreateErrorResponse(HttpStatusCode.Conflict, new ODataError { ErrorCode="...", Message="...", MessageLanguage="..." }));
2) 使用与创建 HttpResponseMessage 相同的方法抛出 HttpResponseException
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.NotFound, new ODataError { ErrorCode="...", Message="...", MessageLanguage="..." }));
3) 抛出自定义类型异常并使用 Web Api 操作过滤器对其进行转换
public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is CustomException)
{
var e = (CustomException)context.Exception;
var response = context.Request.CreateErrorResponse(e.StatusCode, new ODataError
{
ErrorCode = e.StatusCodeString,
Message = e.Message,
MessageLanguage = e.MessageLanguage
});
context.Response = response;
}
else
base.OnException(context);
}
}