Asp.net-Mvc

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

  • July 20, 2020

我已經創建了一個 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 會毫無問題地返回結果:

此變體還按預期顯示 JSON 響應

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;
   }

使用runAllManagedModulesForAllRequests。沒有它,IIS 認為這是一個文件請求,副檔名為小數點後的數字部分。找不到文件,404。

您可以在 web.cong 文件中使用以下程式碼:

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

引用自:https://stackoverflow.com/questions/30739351