我在行动方法上的路线模板如下所示:
[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)错误?
答案 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());
现在您将看到自定义消息。