2013-03-22 14 views
0
定義兩個get函數

我越來越對以下情況例外,當我試圖調用get函數在MVC的WebAPI中的WebAPI

{"$id":"1","Message":"An error has occurred.", 
"ExceptionMessage":"Multiple actions were found that match the request: 
\r\nSystem.Xml.XmlNode Get(Int32, System.String) 

我認爲這個問題是由於兩個get函數 我定義了兩個原因功能:

一:

[HttpGet] 
    public XmlNode Get(int id, string Tokken) 
    { 
     //Do something 
    } 

第二個

[HttpGet] 
public List<UsersAnswers> GetUsersInteractions(int? activityID, string Tokken) 
{ 
    // Do Something 
} 

路由配置

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

現在我收到異常當我嘗試打電話到第二個功能:

{SiteURL}/api/Activities/GetUsersInteractions?activityID=32&Tokken=r54e54353 

正如你所看到的路由引擎將請求發送給第一個功能而不是第二個功能。

如何定義兩個get操作並分別調用每個操作?

+0

一個是GET,另一個是POST, GET的......你粘貼了錯誤的代碼嗎? – Erwin 2013-03-22 10:24:03

+0

是的,我錯誤地粘貼了錯誤的代碼。我編輯了問題。謝謝 – Silagy 2013-03-22 10:26:42

+1

請發佈路線配置。 – 2013-03-22 10:26:45

回答

4

使用默認路由模板,Web API使用HTTP方法來選擇操作。但是,你也可以創造一個動作的名稱包含在URI路徑:

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

在這個路徑模板,在{}動作參數名稱控制器上的操作方法。使用這種路由方式,使用屬性來指定允許的HTTP方法。例如,假設您的控制器有以下方法:

public class ProductsController : ApiController 
{ 
    [HttpGet] 
    public string Details(int id); 
} 

在這種情況下,「API /產品/信息/ 1」將映射到的詳細方法的GET請求。這種類型的路由類似於ASP.NET MVC,可能適合RPC風格的API。

您可以通過使用ActionName屬性來覆蓋操作名稱。在以下示例中,有兩個映射到「api/products/thumbnail/id」的操作:一個支持GET,另一個支持POST:

public class ProductsController : ApiController 
{ 
    [HttpGet] 
    [ActionName("Thumbnail")] 
    public HttpResponseMessage GetThumbnailImage(int id); 

    [HttpPost] 
    [ActionName("Thumbnail")] 
    public void AddThumbnailImage(int id); 
} 
+0

我已經添加了屬性ActionName但它仍然不工作,它仍然擺脫相同的異常 – Silagy 2013-03-22 11:14:18

+0

它執行MapHttpRoute嗎?也許嘗試刪除除了我們正在談論的2之外的所有其他操作方法... – Erwin 2013-03-22 13:11:36

1

您沒有調用第二個函數 - 第二個函數名爲InsertUserRecord並且是POST方法。您通過GET撥打的功能是GetUserInteractions。由於GET沒有這種功能,所以引擎可能將其映射到僅存在的GET函數,但實際上它應該拋出「沒有這樣的函數」錯誤。

+0

但是他沒有得到「沒有這樣的功能」。問題是別的,你提前發佈你的答案。 – 2013-03-22 10:26:15

+0

我發佈了一個錯誤的代碼,我編輯了我的問題 – Silagy 2013-03-22 10:28:35

+0

@DanielHilgarth我寫了一個問題的答案,因爲它 - 現在的情況已經改變,而我的答案現在不再完全正確,它是有效的「第一個版本「的問題:-) – 2013-03-22 11:05:16