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

Asp.net mvc Web API 2需要尾部斜杠才能使自定义属性路由正常工作,asp.net-mvc,rest,asp.net-web-api2,Asp.net Mvc,Rest,Asp.net Web Api2,我已经创建了一个WebAPI2项目,虽然这些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/ http://www.myURL.com/api/v

我已经创建了一个WebAPI2项目,虽然这些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/
http://www.myURL.com/api/v1/get/addressfromlatlong/UK/50.9742794/?longitude=-0.1146699
我有另一个具有自定义操作的控制器,可以正常工作。唯一的区别是它有一个整数参数

这似乎与decimal类型有关,好像我在URL中做了一点小小的更改并使用了一个参数,API会毫无疑问地返回结果:

此变体还按预期显示JSON响应

http://www.myURL.com/api/v1/get/addressfromlatlong/UK/50.9742794/-0.1146699/
http://www.myURL.com/api/v1/get/addressfromlatlong/UK/50.9742794/?longitude=-0.1146699
这不是世界末日,但我也使用Swagger生成API文档,自动使用上述URL中的第一个,并包括内置测试,当然失败了。这对任何引用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;
    }

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

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

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


你说的
不工作是什么意思?你能给我们看一下代码和路线配置吗?也许你在路线属性的末尾有尾随“/”?是的,我为我之前的信息不足而道歉(当时很匆忙)。我现在已经更新了问题,按照要求发布代码和路由配置。哇。你现在指出这一点绝对有道理。快速提问。我发现这篇文章建议使用runAllManagedModulesForAllRequests方法是浪费资源。我已经实现了博客中概述的方法。考虑到我只需要URL路由模块在所有请求上运行,这似乎是一种改进的方法吗?是的,这是一种更好的方法。但是它可能会导致错误,所以您应该测试它是否适合您。