2014-09-11 56 views
0

我嘗試在ASP.NET MVC4應用程序中使用Web Api。ASP.NET Web Api url設計

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 


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

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

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

    public class OrganisationApiController : ApiController 
    { 
     public List<Direction> GetDirections() 
     { 
      List<Direction> res = new List<Direction>(); 
      using (SerializerContext context = new SerializerContext()) 
      { 
       res = context.DirectionSet.ToList(); 
      } 
      return res; 
     } 

     public List<Departement> GetDepartements(int directionId) 
     { 
      List<Departement> res = new List<Departement>(); 
      using (SerializerContext context = new SerializerContext()) 
      { 
       res = context.DepartementSet.Where(d => d.IdDirection == directionId).ToList(); 
      } 
      return res; 
     } 
    } 

應用與

protected void Application_Start() 
     {   
      AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
     } 

開始當我開發我可以打電話給我所有的方法從OrganisationApiController: http://localhost:5000/api/OrganisationApi => GetDirections被稱爲 http://localhost:5000/api/OrganisationApi/GetDirections => GetDirections被稱爲 http://localhost:5000/api/OrganisationApi/GetDepartements/1 => GetDepartement被稱爲與directionId = 1

但是,當我部署在服務器與IIS http://myserver.com:5000/api/OrganisationApi => GetDirections被稱爲 http://myserver.com:5000/api/OrganisationApi/GetDirections => GetDirections被稱爲 http://myserver.com:5000/api/OrganisationApi/GetDepartements/1 => 404錯誤

什麼我失蹤?

+0

如果您使用的Web API 2,看看新的,有光澤的屬性路線。你可以用'[RoutePrefix(「api/organization」)]'來表示你的控制器,然後用'[Route(「」)]'表示你的行爲(路徑簡單地是'api/organization')或'[Route(「{id}」]'等 – Alxandr 2014-09-11 07:18:19

+0

不幸的是我不能使用Web Api 2! – 2014-09-11 08:35:33

+0

看看[AttributeRouting](http://attributerouting.net/#asp-net-web-api)包,你應該能夠使用WebApi 1。 – Tom 2014-09-11 11:25:24

回答

0

你有這些路由問題:

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

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

第二條路線是不必要的(因爲第一個已經處理了這些請求 - ID指定爲可選),它有你指定ID的錯誤是可選的,但路由根本不包含標識。

無論是刪除第二條路線,改變你的行動,以便它收到一個可選的參數或者替換它們:

config.Routes.MapHttpRoute(
        name: "ActionIdApi", 
        routeTemplate: "api/{controller}/{action}/{id}", 
       ); 

       config.Routes.MapHttpRoute(
        name: "ActionApi", 
        routeTemplate: "api/{controller}/{action}", 
       ); 

您的默認死記硬背也是很成問題的方式,因爲你沒有指定默認的控制器和行動 - 它應該是DEFAULT吧...

從我這裏看到的所有路由可以用這一個

config.Routes.MapHttpRoute(
         name: "ApiDefault", 
         routeTemplate: "api/{controller}/{action}/{id}", 
         new { controller = "HomeApi", action="IndexApi" id = RouteParameter.Optional }); 
被替換

只需替換控制器和操作的默認值即可。

編輯:

問題是在你的行動:

如果你在你的路線 「ID」 參數中指定你的動作應該是:

public List<Departement> GetDepartements(int id) 

參數名稱必須匹配。

而且你既可以自己的行爲合併爲一個動作:

public List<Departement> GetDepartements(int? id) 
     { 
      List<Departement> res = new List<Departement>(); 
      using (SerializerContext context = new SerializerContext()) 
      { 
       if(id.HasValue) 
       { 
        res = context.DepartementSet.Where(d => d.IdDirection == directionId).ToList(); 
       } 
       else 
       { 
        res = context.DirectionSet.ToList(); 
       } 
      } 
      return res; 
     } 
+0

我改變了WebApi路由,但問題仍然存在: - 在本地主機上確定 - 在請求參數時有遠程服務器上的KO – 2014-09-11 08:44:58