假设我的uri需要GUID,而客户端正在提供string.empty。
我想控制发送给客户端的错误消息。
默认错误消息是这样的 -
<Error>
<Message>
The request is invalid.
</Message>
<MessageDetail>
The parameters dictionary contains a null entry for parameter 'id' of non-nullable
type 'System.Guid' for method 'xx.xx.MyResponse Get(System.Guid)' in
'xx.xx.MyController'. An optional parameter must be a reference type, a nullable
type, or be declared as an optional parameter.
</MessageDetail>
</Error>
但是如果我想抛出这样的自定义错误 -
<Error>
<Message>
Invalid GUID.....Please enter a valid GUID.
</Message>
</Error>
这是REST方法定义 -
public MyResponse Get(Guid id)
{
// method body
}
我还实现了自定义异常过滤器,但没有达到它 -
public class ResponseExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(statusCode, "Invalid GUID....Please enter a valid GUID.");
}
}
它没有达到OnException并抛出系统错误....我不想要。
现在如果客户端传递“abcd”而不是有效的guid,它应该显示我自己的异常,而不是系统定义的异常。
答案 0 :(得分:2)
它没有到达您的自定义异常过滤器,因为错误没有发生在管道中的控制器/操作级别。现在你有两个选择:
使用消息处理程序修改http错误响应消息:虽然通过这种方式您可以重新设置HttpError
响应,但它会重塑所有HttpError
个。请看一下这篇文章asp.net Web Api - Default Error Messages(另请注意,在这篇文章中,如果您使用的是.NET 4.5,而不是使用ContinueWith
,则可以简单地使用await
作为参考文章:Http Message Handlers)
通过删除路径约束并接受操作方法中的空值来解决此问题:在这种情况下,请删除路径约束并修改操作以接受空值,然后验证输入参数在这样的动作方法中:
[Route("{id}")]
public MyResponse Get(Guid? id)
{
if (id == null)
{
throw new ArgumentException("Please enter a valid Guid.");
}
...
}
答案 1 :(得分:0)
如果我正确地阅读了您的问题,听起来您正在看到系统定义的.NET错误消息,而不是您正在寻找的错误消息。
我认为您只需要启用传递异常: https://stackoverflow.com/a/702809/753958