2016-07-30 128 views
1

真的遇到了麻煩與MVC路由交手,儘管上讀到的博客和教程的負荷......MVC路由煩惱

我有這樣的WebAPI功能:

public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts) 

Route.config默認路由:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

一切正常。

我現在已經添加了另一個功能:

public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories) 

儘管動作名稱是不同的,似乎有衝突,並呼籲它們中的時,我得到一個500 internal server error - 我猜它不知道哪一個使用。

我使用的URL美其名曰:

api/webapiproducts/upsertproducts?marketplaceId={0}&datasourceId={1} 

我試圖通過使用屬性的路由來解決這個問題:

[Route("/api/WebApiProducts/upsertproducts/{marketplaceid}/{datasourceid}")] 
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts) 

[Route("/api/WebApiProducts/reviseinventory/{marketplaceid}/{datasourceid}")] 
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories) 

既不是我的路由屬性似乎工作。我在做什麼錯了,我在這裏不理解路由?

正如@Nkosi指出,我會把錯誤的路徑文件!這裏是我的WebApiConfig.cs內容:

config.MapHttpAttributeRoutes(); 

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

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

回答

0

設法得到它具有屬性的工作通過改變我打電話到這個URL路由:

string.Format("api/webapiproducts/reviseinventory/{0}/{1}", marketplaceId, datasourceId); 
1

你顯示的路由配置是MVC而不是web api。查找WebApiConfig.cs文件,該文件將有路線設置爲Web API

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

     // Convention-based routing. 
     config.Routes.MapHttpRoute(
      name: "DefaultActionApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

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

默認以公約爲基礎建立路由通常是這樣的

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

與出動作佔位這是什麼會導致你的路線衝突。

,使屬性路由做到這一點

config.MapHttpAttributeRoutes(); 

更新WebApiConfig包括適當的設置應該解決您的問題兩個基於慣例和屬性的路由。

+0

你是正確的 - 我加了錯誤的配置文件contect - 我已經更新的問題有正確的數據。儘管使用我的查詢字符串參數仍然有問題。我設法通過更改我打電話的網址來實現它 - 我認爲你可以採取兩種方式。看到我的回答 – Rick

+1

@瑞克。他們可以同時工作。映射路由的順序非常重要,因爲第一條路由匹配獲勝,首先映射更具體的路由,後面映射更多的通用路由。您需要通過將最後一個映射向上一個來切換順序。它沒有達到第二條基於常規的路線,因爲它已經與第一條路線相匹配。 – Nkosi

+0

謝謝,是的,你對訂購是正確的 - 我忘了它。我改變了順序並嘗試使用querystring方法調用,但它仍然無法工作。我似乎仍然必須使用我在答案中提出的方法。 – Rick