如果REST URI中给出的参数无效,如何提供自定义错误消息

时间:2014-03-22 05:00:35

标签: c# rest asp.net-web-api

假设我的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,它应该显示我自己的异常,而不是系统定义的异常。

2 个答案:

答案 0 :(得分:2)

它没有到达您的自定义异常过滤器,因为错误没有发生在管道中的控制器/操作级别。现在你有两个选择:

  1. 使用消息处理程序修改http错误响应消息:虽然通过这种方式您可以重新设置HttpError响应,但它会重塑所有HttpError个。请看一下这篇文章asp.net Web Api - Default Error Messages(另请注意,在这篇文章中,如果您使用的是.NET 4.5,而不是使用ContinueWith,则可以简单地使用await作为参考文章:Http Message Handlers

  2. 通过删除路径约束并接受操作方法中的空值来解决此问题:在这种情况下,请删除路径约束并修改操作以接受空值,然后验证输入参数在这样的动作方法中:

    [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