使用默认示例WebApi项目的略微修改版本,在向URI发送请求时如下:
http://localhost/testing/api/values?foo=foobar&
所有未指定的参数都显式传递给控制器为null,忽略任何默认值。这意味着对于这样的控制器功能:
// GET api/values
public IEnumerable<string> Get(bool all = true, string foo = "bar")
{
return all ? new [] {"value1", "value2", foo} : new [] {"value1", "value2"};
}
我收到此错误:
{
"Message": "The request is invalid.",
"MessageDetail": "The parameters dictionary contains a null entry for parameter 'all' of non-nullable type 'System.Boolean' for method 'System.Collections.Generic.IEnumerable`1[System.String] Get(Boolean, System.String)' in 'testing.Controllers.ValuesController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}
管道上的任何异常过滤器也会忽略此错误。删除尾随的&符号使其工作正常。
有些测试者认为这是一个安全隐患,所以我需要以某种方式修复它。我宁愿不需要遍历所有使用默认参数调用的控制器实例,并将它们更改为可空,只是为了解决这个不是真正的问题。
那么,如何做以下其中一项:
答案 0 :(得分:1)
DelegatingHandler
在管道中调用控制器之前运行,并且可以捕获此错误。
此处理程序可用于检测此特定问题,并根据您的选择修复它,以便默认模型绑定器再次正常工作,或抛出异常并抱怨URI。
public class AmpersandHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
var uriString = request.RequestUri.OriginalString;
if (uriString.Last() == '&')
{
request.RequestUri = new Uri(uriString.Substring(0, uriString.Length - 1));
//return request.CreateErrorResponse(HttpStatusCode.BadRequest, "Unparseable URI - Trailing &");
}
return await base.SendAsync(request, cancellationToken);
}
}
处理程序应该使用以下代码行在Register
静态类的WebApiConfig
函数中注册(创建新webapi项目时自动生成的样板文件的一部分):
config.MessageHandlers.Add(new AmpersandHandler());