4

當試圖找到這個問題如下解決方案:如何繞過例外的ASP.NET Web API發現多個操作

MVC Web Api Route with default action not working

主要是我在整個問題上運行「多個動作被發現」。如果路由機制發現與路由匹配不止一個動作,它拋出異常500

例如,有兩個動作在ValuesController:

[HttpGet] 
public IEnumerable<String> Active() 
{ 
    var result = new List<string> { "active1", "active2" }; 
    return result; 
} 

public IEnumerable<string> Get() 
{ 
    return new[] { "value1", "value2" }; 
} 

匹配缺省路由,其中​​:

routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
    ); 

隨着

GET: /api/values 

將得到WER錯誤多個動作e找到了。

我的問題:如何通過選擇指定的動作(選擇第一個匹配的動作也沒關係)繞過異常「發現多個動作」。

更新1:更新tugberk的評論,謝謝指出。

更新2:從邁克的評論更新,似乎這個問題是不正確的多,所以我改變的不提路由約束問路。

感謝

+0

嗯,它應該不可能匹配** Active **動作,除非您在其上應用'HttpGet'屬性。 – tugberk 2012-07-31 12:34:14

+0

我已經更新了問題以添加HttpGet屬性 – 2012-07-31 15:01:23

回答

6

首先,它不應該是可能的,除非你申請HTTPGET屬性上的路線,以配合主動行動。我會假設你已經這樣做了。第二件事是你想要的不合邏輯。您想要提出獲取請求並有兩個相同的操作。您現在正在使用所謂的基於HTTP方法的路由。對於你的情況,我確信所謂的基於動作的路由是最好的。

假設你有以下兩個動作:

[HttpGet] 
public IEnumerable<String> Active() 
{ 
    var result = new List<string> { "active1", "active2" }; 
    return result; 
} 

[HttpGet] 
public IEnumerable<string> Retrieve() 
{ 
    return new[] { "value1", "value2" }; 
} 

你的路線應該如下:

routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{action}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

然後你就可以要求那些具有下列的URI:

GET /控制器名稱/檢索

GET/controllername/active

+0

感謝您的回答,並且是的,我知道默認路由框架基本不支持此操作,我試圖找到解決方法。你的假設當然是完美的。但是我想我們是否可以在這裏應用Route Constraint – 2012-07-31 15:04:10

+1

但是在你的例子中,這兩個動作映射到「GET api/values」。路由約束確定給定的URI是否與模板匹配。它匹配或不匹配。只有在路線匹配後才選擇該操作。如果兩個操作都具有相同的參數簽名和相同的HTTP方法,並且您沒有使用基於操作的路由,那麼它們必然是不明確的。 – 2012-07-31 15:32:21

+0

感謝Mike的評論,我明白了你的觀點,如果我們不能像你提到的那樣使用路由約束,是否有任何方法可以通過選擇指定的動作或第一個動作來避免拋出的異常? – 2012-07-31 16:06:32

相關問題