c# - .NET WebApi 在 url 以 & 结尾时中断

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

我有一个 ApiController - 例如“Home” Controller ,其 Action “Test”接受两个参数 - test1 和 test2,均具有默认值

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

现在当我调用 Home/Test?test1=1 时,一切正常。
但是当我调用 Home/Test?test1=1& 时,服务器抛出异常

The parameters dictionary contains a null entry for parameter 'test2' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Test(Int32, Int32)' in 'TestAPI.Controllers.ValuesController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

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

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 继承的是 Controller 而不是 ApiController - 一切都很好。

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

最佳答案

您可以使用自定义 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 中注册新的 Handler:

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

或者将它添加到您的 HttpConfiguration(然后它只被 Webapi 调用调用):

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

关于c# - .NET WebApi 在 url 以 & 结尾时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46889830/

相关文章:

c# - 在 Web API 中 Controller 初始化之前执行一些操作(设置语言)

c# - 在 C# 中将一个应用程序附加到另一个应用程序

c# - 异步函数可以内联吗?

apache - 在 apache windows 上禁止访问包含冒号符号 ":"的 url

http -//或/-/是有效的 URL 组件吗?

php - 如何更改德语元音变音以获得友好的 URL?

C# - 如果参数继承自接口(interface),则将字段值添加到 Controller 参数的中间件

c# - 使用多个工作表创建 excel

c# - 点击回车键提交

javascript - POST 从 Typescript 到 Web API API,无法传递 JSON 对象