当url以&符结束时,.NET WebApi会中断

时间:2017-10-23 12:50:29

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

我有一个ApiController - 例如'Home'控制器,动作'Test'接受两个参数 - test1和test2,都有默认值

[System.Web.Http.HttpGet]
public ActionResult Test(int test1 = 3, int test2 = 5)
{
    var a = 0;
    return null;
}

现在,当我打电话给主页/测试?test1 = 1 时,一切正常 但是当我调用 Home / Test?test1 = 1& 时,服务器会抛出异常

  

参数字典包含非可空类型'System.Int32'参数'test2'的空条目用于方法   'System.Web.Mvc.ActionResult Test(Int32,Int32)'   'TestAPI.Controllers.ValuesController'。必须是可选参数   引用类型,可空类型,或声明为可选类型   参数。

我的路线配置目前是这样的:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

这也发生在一个全新的WebApi项目中,因此它不是我的配置。
最大的问题是这个&符号来自客户端项目,我不能在那里更改它,虽然我知道这是一个糟糕的请求。

最奇怪的是,如果Home控制器继承Controller而不是ApiController - 一切都很好。

编辑1
我忘了提到如果我使参数可以为空(即int?),那么错误消失,但是当调用错误的URL时,test2的值为null而不是5,所以这对我来说不是一个选项。

1 个答案:

答案 0 :(得分:2)

您可以使用自定义DelegatingHandler并删除尾随'&':

public class SanitizeHandler : System.Net.Http.DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request.RequestUri.ToString().EndsWith("&"))
            request.RequestUri = new Uri(request.RequestUri.ToString().TrimEnd('&'));

        return base.SendAsync(request, cancellationToken);
    }
}

Application_Start注册新的处理程序:

GlobalConfiguration.Configuration.MessageHandlers.Add(new SanitizeHandler());

或者将其添加到HttpConfiguration(然后仅通过Webapi调用调用它):

public static void Register(HttpConfiguration config)
{
    ...
    config.MessageHandlers.Add(new SanitizeHandler());
    ...   
}