Web API 2 需要尾部斜杠才能使自定义属性路由正常工作

Web API 2 requires trailing slash for custom attribute routing to work

我已经创建了一个 Web API 2 项目,虽然 API 工作正常,但我必须输入尾部斜杠才能这样做。

这导致 404

http://www.myURL.com/api/v1/get/addressfromlatlong/UK/50.9742794/-0.1146699

这显示 JSON 响应符合预期

http://www.myURL.com/api/v1/get/addressfromlatlong/UK/50.9742794/-0.1146699/

我有另一个带有自定义操作的控制器,效果很好。唯一的区别是它有一个整数参数...

这似乎与小数类型有关,好像我在 URL 中做了一些细微的变化并使用了一个参数, API returns 结果没有问题:

此变体还显示了预期的 JSON 响应

http://www.myURL.com/api/v1/get/addressfromlatlong/UK/50.9742794/?longitude=-0.1146699

这不是世界末日,但我也使用 Swagger 生成我的 API 文档,它自动使用上面的第一个 URLs 并包括内置测试,其中,当然,失败。对于任何参考 API 文档的开发人员来说,这都不太好。

任何人都可以解释为什么会发生这种情况以及我如何在没有尾部斜线的情况下让它工作吗?

路由配置

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

自定义属性和控制器操作

[Route("get/addressfromlatlong/UK/{latitude:decimal=0}/{longitude:decimal=0}")]
    public AddressDetails GetAddressDetailsByLatLong(decimal latitude, decimal longitude)
    {
        AddressDetails addressDetails = repository.GetAddressDetailsByLatLong(latitude, longitude);
        return addressDetails;
    }

使用runAllManagedModulesForAllRequests。没有它,IIS 认为它是一个文件请求,扩展名是小数点后的数字部分。找不到文件,404。

您可以在 web.cong 文件中使用以下代码:

<system.webServer>
 <modules runAllManagedModulesForAllRequests="true">
 </modules>
</system.webServer>