2014-09-11 6 views
0

ASP.NET MVC4 응용 프로그램에서 Web API를 사용하려고합니다. 이 =라고 http://localhost:5000/api/OrganisationApi/GetDirections => GetDirections라고합니다> GetDirections http://localhost:5000/api/OrganisationApi/GetDepartements/1 => GetDepartement가 호출 http://localhost:5000/api/OrganisationApi : 나는 OrganisationApiController에서 내 모든 메소드를 호출 할 수 개발할 때ASP.NET 웹 API 디자인

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); 
     } 

시작 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

당신이 웹 API (2)를 사용하는 경우, 새로운 반짝 속성 라우팅을 살펴. 컨트롤러를'[RoutePrefix ("api/organization")]'와 같이 표시 한 다음'[Route ("")]'(단순히 경로가 api/organization 일 때) – Alxandr

+0

불행히도 Web API 2를 사용할 수 없습니다! –

+0

[AttributeRouting] (http://attributerouting.net/#asp-net-web-api) 패키지를 확인하십시오. WebApi 1에서이를 사용할 수 있어야합니다. – Tom

답변

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를 지정하는 오류가 선택 사항이지만 경로에 ID가 전혀 없습니다.

어느 두 번째 경로를 제거하고 선택적 매개 변수를 받거나로 교체 귀하의 작업을 변경 : 당신이 기본 컨트롤러와 액션을 지정하지 않기 때문에 기본 기계적도 매우 문제가 그런데

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

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

- 내가 여기에 모든 노선이 하나

config.Routes.MapHttpRoute(
         name: "ApiDefault", 
         routeTemplate: "api/{controller}/{action}/{id}", 
         new { controller = "HomeApi", action="IndexApi" id = RouteParameter.Optional }); 
로 대체 될 수 무엇을보고에서 DEFAULT 바로 ...

있어야

컨트롤러 및 작업의 기본값을 바꿉니다.

편집 :

문제는 당신의 행동에있다 : 당신이 당신의 경로 "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 경로가 변경되었지만 문제가 아직 남아 있습니다. - 로컬 호스트에서 OK - 요청시 매개 변수가있을 때 먼 서버의 KO –