0

我正在使用Web API 2,並在URL以正斜槓結尾時看到意外的路由行爲。我的Web API配置看起來像這樣。當URL以正斜槓結尾時發生意外的Web API路由

public void Configuration(IAppBuilder appBuilder) 
    { 
     HttpConfiguration webApiConfig = new HttpConfiguration(); 
     webApiConfig.MapHttpAttributeRoutes(); 
     webApiConfig.EnsureInitialized(); 

     appBuilder.UseWebApi(webApiConfig); 
    } 

在WebApp.Start()我通過的網址http://host:port/configuration

我有兩個路由設置。

[Route("~/")] 
    public object GetResourcesList() 
    { 
     return new List<string>() { "Resource 1", "Resource 2", "Resource n" }; 
    } 

    [Route("~/{resourceName}")] 
    public object GetResource(string resourceName) 
    { 
     return "Resource " + resourceName; 
    } 

如果我做一個GET請求http://host:port/configuration/它調用GetResourceList()預期。

如果我向http://host:port/configuration(末尾沒有正斜槓)發出GET請求,它會調用GetResource()並返回「資源配置」。我希望它能撥打電話GetResourceList()

爲什麼會在第二個例子中調用GetResource()?爲什麼當WebApp.Start應該在http://host:port/configuration而不是http://host:port上偵聽時,它將通過配置作爲resourceName?

我也試過[Route("")][Route("{resourceName}")]分別爲GetResourceList()GetResource(),看到了相同的行爲。

感謝您的幫助。

編輯

我也只是(在結尾加上一個斜線)試圖監聽http://host:port/configuration/。行爲沒有差異。

回答

1

我還沒有搞砸OWIN自我託管的東西,但我的猜測是,它正在監聽你提供的URI,但仍然傳遞整個URL,即路由選擇的路徑不是相對的到您提供的URI。

我想你的屬性的路由從

[Route("~/")] 

[Route("~/{resourceName}")] 

改變

[Route("configuration")] 

[Route("configuration/{resourceName}")] 

或使用

[RoutePrefix("configuration")] 
+0

這將引發ArgumentException「路由模板不能以‘/’或‘〜’字符開始,它不能包含一個路由前綴‘?’字符」。 使用代字符更像是最後一次嘗試。我確實嘗試了[Route(「」)],我認爲這與您的建議相當。 – 2014-12-03 00:51:39

+0

@ r2_118答案還爲時過早。編輯 – joelmdev 2014-12-03 00:55:51