是否有改变的错误信息,如网络API的默认行为的一种方式:
GET /trips/abc
与(转述)回应:
HTTP 500 Bad Request
{
"Message": "The request is invalid.",
"MessageDetail": "The parameters dictionary contains a null entry for parameter 'tripId' of non-nullable type 'System.Guid' for method 'System.Net.Http.HttpResponseMessage GetTrip(System.Guid)' in 'Controllers.TripController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}
我想避免给了我的代码,这个相当的相关详细信息,而是喜欢的东西取代它:
HTTP 500 Bad Request
{
error: true,
error_message: "invalid parameter"
}
我能做到这一点的UserController的内部,但执行代码甚至不走那么远。
编辑:
我发现从输出去除详细的错误信息,使用此行代码在Global.asax.cs中的一种方式:
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy =
IncludeErrorDetailPolicy.LocalOnly;
这产生这样的消息:
{
"Message": "The request is invalid."
}
这是更好的,但是不正是我想要的 - 我们已经指定了一些数字错误代码,它映射到详细的错误信息的客户端。 我想只输出相应的错误代码(即我能之前输出选择,preferrably通过看什么样的异常的发生),例如:
{ error: true, error_code: 51 }
你可能想保持数据的形状,即使你想隐瞒实际的异常详细信息类型HttpError。 要做到这一点,你可以添加自定义DelegatingHandler修改HttpError您的服务抛出。
这里的DelegatingHandler如何可能看起来像一个示例:
public class CustomModifyingErrorMessageDelegatingHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) =>
{
HttpResponseMessage response = responseToCompleteTask.Result;
HttpError error = null;
if (response.TryGetContentValue<HttpError>(out error))
{
error.Message = "Your Customized Error Message";
// etc...
}
return response;
});
}
}
张曼玉的回答为我工作为好。 感谢张贴!
只是想一些位给她额外的澄清代码:
HttpResponseMessage response = responseToCompleteTask.Result;
HttpError error = null;
if ((!response.IsSuccessStatusCode) && (response.TryGetContentValue(out error)))
{
// Build new custom from underlying HttpError object.
var errorResp = new MyErrorResponse();
// Replace outgoing response's content with our custom response
// while keeping the requested MediaType [formatter].
var content = (ObjectContent)response.Content;
response.Content = new ObjectContent(typeof (MyErrorResponse), errorResp, content.Formatter);
}
return response;
哪里:
public class MyErrorResponse
{
public MyErrorResponse()
{
Error = true;
Code = 0;
}
public bool Error { get; set; }
public int Code { get; set; }
}