替换Web Api 2.2的类型转换中的默认错误消息

时间:2016-06-10 17:34:06

标签: c# .net json.net asp.net-web-api2

我在Web Api 2.2(C#)中创建了一个RESTful服务

该方法的输入如下:

    public HttpResponseMessage Post([FromBody] PaymentInput paymentInput)

我的PaymentInput对象具有以下属性:

    [Required]
    [RegularExpression(@"^[0-9\.]*$", ErrorMessage = "ProductId must be an integer")]
    public int ProductId { get; set; }

在任何情况下,我都会收到默认错误消息,而不是我的错误消息,我认为因为模型验证是先完成的,而不是正则表达式验证。

例如:

            "productId": helloworld,

返回:

{
"message": "The request is invalid."
"modelState": {
"paymentInput.productId": [2]
0:  "Unexpected character encountered while parsing value: v. Path 'productId', line 6, position 30."
    -
}-
}

以下案例:

            "productId": "helloworld",

返回相同的内容。

所以,我的问题是:

如何更改此消息?

提前致谢并致以亲切的问候

2 个答案:

答案 0 :(得分:1)

我认为错误消息说明了所有

  

解析值时遇到意外的字符

因为,ProductId类型是int,所以系统首先尝试将JSON值解析为int,然后将进行任何验证。在解析自身时失败了,因此不存在任何其他验证的问题。

我认为如果您将ProductID的类型更改为字符串,那么您的正则表达式验证将启动以验证正确格式的输入字符串。正则表达式是在字符串而不是整数上执行的。

答案 1 :(得分:1)

public class PaymentInput {
    // [Required] //removed Required unless you want a different message if nothing is provided
    [RegularExpression(@"^[0-9\.]+$", ErrorMessage = "ProductId must be an integer")] 
    // changed regex to + instead of * which forces it to have at least 1 passed in character
    public string ProductId { get; set; }

    public int GetProductId() { return int.Parse(ProductId); }
}
  • 此更改将允许用户将任何内容传递到ProductId中。
  • 它允许您在ProductId值上执行正则表达式。
  • 它允许您在RegularExpression属性中返回错误消息。

我唯一想补充的是,您是否应该担心更改消息?

在我看来,信息非常明确,不会将非数字传递给productId。验证应由客户进行,以确保不会发生这种情况。如果确实如此,则表示客户端也生成了用户友好的错误消息。我个人不会尝试让Web API传回友好的错误消息,它的PITA加本地化不是它应该关注的东西(不同语言的消息)。此外,您现在必须将所有传入参数更改为字符串类型,然后在代码中对它们进行验证,并为每个参数返回自定义错误消息。

简而言之,最好是:

  • 保持服务器代码不变,它正在完成它的工作。它还意味着您需要在服务器上进行更少的编码。
  • 确保客户端在将消息发送到服务器之前在某种程度上验证输入。如果这是一个外部API,则编写文档或生成API文档,调用者在编写接口时可以使用这些文档。
  • 处理客户端上的例外和消息。