2014-09-11 44 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