在URI中遇到尾随符号时如何处理奇怪的行为?

时间:2018-05-23 14:25:19

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

使用默认示例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."
}

管道上的任何异常过滤器也会忽略此错误。删除尾随的&符号使其工作正常。

有些测试者认为这是一个安全隐患,所以我需要以某种方式修复它。我宁愿不需要遍历所有使用默认参数调用的控制器实例,并将它们更改为可空,只是为了解决这个不是真正的问题。

那么,如何做以下其中一项:

  1. 抓住此例外并将其替换为我自己的
  2. 完全拒绝这样的URI
  3. 一些其他解决方案,当发生这种情况时,防止类名显示在请求输出中(调试模式关闭,无论如何都会这样做)

1 个答案:

答案 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());