1

我一直在努力解決這個問題至少4個小時,試着找到每個解決方案。如何從一個MVC項目路由到另一個項目中的MVC ApiController?

我的主項目是用Asp.Net和MVC建立的,它可以很好的路由到項目中的控制器。我正在集成一個庫,公開一個JSON API,在另一個項目中使用ApiControllers,但我無法獲得主項目路由到庫項目中的任何東西,它只是返回一個海峽404.

在我的主項目Global.asax中:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{*allaxd}", new { allaxd = @".*\.axd(/.*)?" }); 
     routes.IgnoreRoute("{*less}", new { less = @".*\.less(/.*)?" }); 

     //ignore aspx pages (web forms take care of these) 
     routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); 
     routes.IgnoreRoute("{resource}.css/{*pathInfo}"); 

     //ControllerBuilder.Current.DefaultNamespaces.Add("Nexus.Controllers"); 

     routes.MapRoute(
      "testapi", 
      "testapi/{controller}/{action}", 
      new 
      { 
       controller = "User", 
       action = "Get" 
      }, 
      new[] { "Nexus.Controllers" } 
     ); 

     routes.MapRoute(
      // Route name 
      "Default", 
      // URL with parameters 
      "{controller}/{action}/{id}", 
      // Parameter defaults 
      new { controller = "Events", action = "Index", id = "" } 
     ); 

    } 

在我的庫項目UserController中:

namespace Nexus.Controllers 
{ 
    public class UserController : ApiController 
    { 
     public Object Get(string id) 
     { 
      var guid = new Guid(id); 

      var user = crm.Users.Where(x => x.UserId == guid).FirstOrDefault(); 

      return new 
      { 
       id = user.UserId, 
       name = user.UserName, 
       email = user.Email, 
       extension = user.Ext, 
       phone = user.Phone 
      }; 
     } 
    } 
} 

,我希望作品的網址中都沒有: /testapi /testapi /用戶 /testapi /用戶/ G ?等 /testapi /用戶/獲取ID = 1

他們都返回404

我甚至用路線調試器來驗證路徑似乎是正確設置: routes

我錯過了什麼?

+0

我想你已經添加了外部庫作爲你的項目的參考? –

+0

是的,我的項目正在使用庫項目中的很多數據模型。 – DShook

+0

有點困惑,你正在使用的Action方法'Get'。我習慣於返回[ActionResult]的動作(http://msdn.microsoft.com/en-us/library/dd410269(v = vs.98).aspx) –

回答

4

您似乎混淆了標準MVC控制器(衍生自System.Web.Mvc.Controller類)和API控制器(衍生自System.Web.Http.ApiController類)。您的UsersController是一個API控制器。

所以,如果你想配置Web API路由,你需要使用MapHttpRoute擴展方法,而不是MapRoute,它只用於標準的MVC控制器。

像這樣:

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
    name: "testapi", 
    routeTemplate: "testapi/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

還要注意,在一個RESTful API,你不要在路徑中指定的操作名稱。它是從用來消費它的HTTP動詞中假定的。這裏有一個good article我建議你閱讀Web API中的RESTful路由。

相關問題