WebAPI 2中QueryParameter类型不匹配的错误消息

时间:2017-10-09 05:52:38

标签: c# asp.net-web-api c#-4.0 asp.net-web-api2 asp.net-web-api-routing

我在行动方法上的路线模板如下所示:

[Route("{select:bool=false}")]

和方法签名是 public int GetMethod(bool select) {}

问题1:

我使用以下网址在端点上方消费。我将字符串值传递给布尔参数

http://localhost/api/controller?select= lskdfj

我收到以下回复:

{
"Message": "The request is invalid.",
"MessageDetail": "The parameters dictionary contains a null entry for parameter 'select' of non-nullable type 'System.Boolean' for method 'int GetMethod(Boolean)' in '**ProjectName.Controllers.ControllerName**'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}

我希望向消费者/客户端显示一些自定义消息,而不是显示projectName,控制器名称是我们代码的详细信息以及上面的消息。

有办法吗?

问题2:

我使用以下网址在端点上方消费。我通过提供不正确的参数名称来传递。

http://localhost/api/controller?的 SELT =真

它不会抛出错误并采用select的默认值,即false而不是抛出错误。

如何向客户端抛出错误消息,提到参数提供(selt)错误?

1 个答案:

答案 0 :(得分:0)

  

我没有显示projectName,控制器名称是我们代码的详细信息,而且上面的消息还有更多细节,我想向消费者/客户端显示一些自定义消息。

选项1

如果要隐藏代码的详细信息,可以在Global.asax.cs文件中修改配置,如下所示:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
    IncludeErrorDetailPolicy.Never; // Or Local

选项2

如果要自定义消息,则需要“挂钩”到处理管道中并在响应出门之前更改响应。为此,您需要创建Custom Message Handler。以下是我快速为您准备的内容:

public class CustomMessageHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // Call the inner handler.
        var response = await base.SendAsync(request, cancellationToken);
        if (response.StatusCode == System.Net.HttpStatusCode.BadRequest &&
            request.RequestUri.ToString().Contains("getmethod"))
        {
            HttpError error = null;
            if (response.TryGetContentValue(out error))
            {
                // Modify the message details
                error.MessageDetail = "Something customized.";
            }
        }
        return response;
    }
}

通过添加以下代码行在 WebApiConfig.cs 中注册上述消息处理程序:

config.MessageHandlers.Add(new CustomMessageHandler());

现在您将看到自定义消息。