9

Я использую asp.net mvc 5 и web api 2. Для проекта asp.net mvc 5 у меня есть все, что работает ... но новое я пытаюсь добавить веб-маршруты api 2 ... когда я использую области.web api 2 области маршрутов

У меня есть контроллер веб-апи 2 работает в корневом каталоге проекта:

//this is working 
    namespace EtracsWeb.Controllers 
    { 
     public class TestController : ApiController 
     { 
      //localhost:port/api/test ...this is working 
      [HttpGet] 
      public HttpResponseMessage Get() 
      { 

       return new HttpResponseMessage() 
       { 
        Content = new StringContent("GET: Test message") 
       }; 
      } 

     } 
    } 

Так я предполагаю, что мой Global.asax, мой routeconfig.cs и мой webapiconfig.cs правильны ... (не показан) ...

Но теперь я пытаюсь получить веб-апи 2 в моих РАЙОНАХ рабочих ...

Я прочитал все, что я мог бы найти в Интернете, и это кажется, что это должно работа:

namespace EtracsWeb.Areas.WorkOrder 
{ 
    public class WorkOrderAreaRegistration : AreaRegistration 
    { 
     public override string AreaName 
     { 
      get 
      { 
       return "WorkOrder"; 
      } 
     } 

     public override void RegisterArea(AreaRegistrationContext context) 
     { 

      context.Routes.MapHttpRoute(
        name: "AuditModel_Api", 
        routeTemplate: "WorkOrder/api/AuditModelApi/{id}", 
        defaults: new { id = RouteParameter.Optional } 
       ); 

     //default 
      context.Routes.MapHttpRoute(
        name: "WorkOrder_Api", 
        routeTemplate: "WorkOrder/api/{controller}/{id}", 
        defaults: new { id = RouteParameter.Optional } 
       ); 

      context.MapRoute(
       "WorkOrder_default", 
       "WorkOrder/{controller}/{action}/{id}", 
       new { action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 
} 

Мой код контроллера:

namespace EtracsWeb.Areas.WorkOrder.ApiControllers 
{ 
    public class AuditModelApiController : ApiController 
    { 
     IManufacturerStopOrderModelService auditModelService = new WorkOrder.Services.VWAuditModelService(UserSession.EtracsUserID, UserSession.ProgramID, UserSession.EtracsSessionID, UserSession.ConnectionString); 

     [HttpGet] 
     [Route("AuditModelApi")] 
     public HttpResponseMessage Get() 
     { 

      return new HttpResponseMessage() 
      { 
       Content = new StringContent("GET: Test message") 
      }; 
     } 

     [Route("AuditModelApi/AuditModels")] 
     public IEnumerable<VwAuditModel1> GetAuditModels() 
     { 
       return auditModelService.GetModels(); 
     } 

     public IHttpActionResult UpdateAuditMode() 
     { 
      //example of what can be returned ... NotFound, Ok ... look into uses... 

      VwAuditModel1 result = new VwAuditModel1(); 
      return Ok(result); 

      return NotFound(); 
     } 
    } 
} 

Я попытался контроллер и без атрибута именования [Route] ... и я не могу получить или получить работу ...

и простой случай

public HttpResponseMessage Get() 

и "реальный" случай

public IEnumerable<VwAuditModel1> GetAuditModels() 

вернуть тот же результат. С помощью браузера, используя

http://localhost:64167/WorkOrder/api/AuditModelApi 

и

http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels 

Я получаю следующее:

<Error> 
<Message> 
No HTTP resource was found that matches the request URI 'http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels'. 
</Message> 
<MessageDetail> 
No route providing a controller name was found to match request URI 'http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels' 
</MessageDetail> 
</Error> 
+0

добавить webapiconfig.cs codeto ur post. То, где u r отсутствует для регистрации маршрутов атрибутов, я предполагаю. –

ответ

2

Вы должны получить HttpConfiguration экземпляр из GlobalConfiguration объекта и вызвать метод MapHttpAttributeRoutes() внутри RegisterArea() способа AreaRegistration.cs.

public override void RegisterArea(AreaRegistrationContext context) 
    { 
     GlobalConfiguration.Configuration.MapHttpAttributeRoutes(); 

     //... omitted code 
    } 

Наконец, вы должны в WebApiConfig удалить config.MapHttpAttributes() метод или вы получите дубликат исключение.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     config.EnableCors(); 

     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 


     // Web API routes 
     //config.MapHttpAttributeRoutes(); 

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

Похоже, что [должно быть вместо этого] (http://stackoverflow.com/a/19882528/712526) 'GlobalConfiguration.Configure (x => x.MapHttpAttributeRoutes())' как из Web Api v2 , – jpaugh

3

Проблема с этим конкретным вызовом API является то, что вы не указали контроллер для использования в ваш маршрут.

 context.Routes.MapHttpRoute(
       name: "AuditModel_Api", 
       routeTemplate: "WorkOrder/api/AuditModelApi/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

Должно быть

 context.Routes.MapHttpRoute(
       name: "AuditModel_Api", 
       routeTemplate: "WorkOrder/api/AuditModelApi/{id}", 
       defaults: new { controller = "AuditModelApi", id = RouteParameter.Optional } 
      ); 

Постоянные сегменты в URL должны указать, что URL, чтобы соответствовать, но вы все равно должны сказать ему, что значения маршрута являются для того, чтобы добраться до контроллера и действие. Он не знает, какой сегмент использовать в качестве имени контроллера, если вы не сделаете его сегментом {controller}.

+0

Это работает ... Спасибо ... но это связывает область с одним контроллером. Что мы будем делать, если есть несколько контроллеров? – user2040850

+0

В этом случае вы должны указать аргумент routeTemplate с помощью заполнителя контроллера: 'WorkOrder/api/{controller}/{id)'. – NightOwl888

+0

Я исходный код для регистрации Я уже пробовал вариант этого ... НЕ указывая контроллер и используя маршрут, который вы дали .. и он дал ошибку, что он не смог найти ресурс (снова см. Исходное сообщение) ... Я думал, что это правильно ... у меня что-то не так написано в инструкции mapphttproute? – user2040850

3

Во-первых, вы должны зарегистрировать маршрут с областью он принадлежит, что только имеет смысл, так внутри ваш AreaNameAreaRegistration класс не забудьте добавить using System.Web.Http так что вы получите метод расширения MapHttpRoute, это не часть System.Web.Mvc.

Приведенный выше порядок немного выключен, что вызывает 404.Добавьте следующий маршрут:

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

Если вы хотите получить фантазии и добавить название участка из собственности AreaName (конечно, вы заботитесь о хорошей практике кодирования;)):

context.Routes.MapHttpRoute(
      name: "AreaNameWebApi", 
      routeTemplate: string.Concat("api/", AreaName, "/{controller}/{id}"), 
      defaults: new { id = RouteParameter.Optional } 
     ); 

Это исправит вопрос 404. В модуле Web API по умолчанию он сначала сканирует «api», чтобы определить, где искать контроллер (иначе он будет запутан, это не волшебство), поэтому api должен быть первым, когда динамически добавляет имя и контроллер зоны. Конечно, вы можете изменить этот порядок путем жесткого кодирования ваших маршрутов, но я не рекомендую это, потому что вам нужно будет предоставить каждый маршрут и каждый контроллер в конфигурации маршрута или используя RouteAttribute.

Плюс, с «api» сначала он сделает хороший стандартный URL-адрес для вас и ваших пользователей, вместо того чтобы иметь API повсюду. Вот несколько примеров:

http://site/api/members/myAccount/update 
http://site/api/members/myAccount/get/12345 
http://site/api/members/contacts/getByOwnerId/12345 

Надеюсь, это поможет!

Зев

Смежные вопросы