2016-06-28 4 views
1

У меня есть проект C# с использованием Web API. Я определил мой префикс и маршрутизации для моего контроллера, но я постоянно получаю сообщение об ошибке при попытке получить доступ к «все» по маршруту:Контроллер Web API не распознан

{ 
"message": "No HTTP resource was found that matches the request URI '.../api/InventoryOnHand/all'.", 
"messageDetail": "No type was found that matches the controller named 'InventoryOnHand'." 
} 

Вот мой контроллер:

[RoutePrefix("api/inventoryonhand")] 
public class InventoryOnHandController : ApiController 
{ 
    public InventoryOnHandController(){} 
    [HttpGet] 
    [Route("all")] 
    [CacheOutput(ClientTimeSpan = 50, MustRevalidate = true)] 
    public IHttpActionResult GetAllInventoryOnHand() 
    { 
     // Do stuff 
    } 
} 

Мой WebApiConfig ISN» (я думаю), потому что у нас есть другие маршруты, которые работают отлично, не могу понять, почему этот человек странный. Наша маршрутизация в WebApiConfig:

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

EDIT Добавление файла WebApiConfig:

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

     // require authenticated users in all controllers/action unless decoratd with "[AllowAnonymous]" 
     config.Filters.Add(new AuthorizeAttribute()); 

     config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
     config.Services.Add(typeof(IExceptionLogger), new SerilogExceptionLogger()); 
     ConfigureJsonHandling(config.Formatters.JsonFormatter); 

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

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

    private static void ConfigureJsonHandling(JsonMediaTypeFormatter json) 
    { 
     //make our json camelCase and not include NULL or default values 
     json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
     json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
     json.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Ignore; 
     json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore; 

    } 

EDIT Добавление файла запуска (укороченный для краткости):

public void Configuration(IAppBuilder app) 
    { 
     LoggingConfig.ConfigureLogger(); 

     HttpConfiguration httpConfiguration = new HttpConfiguration(); 

     var container = IoC.Initialize(); 
     httpConfiguration.DependencyResolver = new StructureMapResolver(container); 

     ConfigAuth(app); 

     WebApiConfig.Register(httpConfiguration); 


     GlobalConfiguration.Configure(WebApiConfig.Register); 


     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
     app.UseWebApi(httpConfiguration); 

     Log.Logger.ForContext<Startup>().Information("======= Starting Owin Application ======"); 
    } 
+0

Вы проверили, является ли это проблемой чувствительности к регистру? – im1dermike

+0

Просто попробовал варианты ** «inventoryonhandcontroller» ** и ** «inventoryonhandController» **, все еще не удалось. – Thomas

+0

Убедитесь, что маршрут за частью «api» соответствует виртуальному каталогу в IIS. –

ответ

1

Поскольку вы используя атрибуты, вы не можете получить маршрутизацию по соглашению. В вашем WebApiConfig (где у вас есть маршрут прямо сейчас), вам нужно добавить строку в config.MapHttpAttributeRoutes(), как это:

config.MapHttpAttributeRoutes(); 

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

Вызов метода расширения MapHttpAttributeRoutes является то, что подберут атрибуты route/routeprefix и создать новый маршрут к вашему методу.

+0

У меня уже есть реализованный – Thomas

+0

Обновлен код в моем ответе. Сначала вам нужно сопоставить маршруты атрибутов. В противном случае URL-адрес сопоставляется с вашим маршрутом, основанным на соглашениях, но на маршрутах, основанных на соглашениях, невозможно увидеть контроллеры, украшенные атрибутами маршрута. – rmc00

+0

Выполнено, все еще имея такую ​​же проблему. – Thomas

0

Attribute Routing in ASP.NET Web API 2

Порядок, в котором отображаются маршруты важно. Маршрутизация маршрута атрибута config.MapHttpAttributeRoutes() должна выполняться до маршрутов, основанных на соглашениях, потому что, когда структура соответствует маршрутам в таблице маршрутов, выигрывает первое совпадение. Если маршрут соответствует соглашению, он не достигнет маршрутов атрибутов.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     //..other code removed for brevity 

     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

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

ApiController

[RoutePrefix("api/inventoryonhand")] 
public class InventoryOnHandController : ApiController { 
    public InventoryOnHandController(){} 

    //GET api/inventoryonhand 
    [HttpGet] 
    [Route("")] 
    [CacheOutput(ClientTimeSpan = 50, MustRevalidate = true)] 
    public IHttpActionResult GetAllInventoryOnHand() { 
     // Do stuff 
    } 
} 

Попробуйте это в автозагрузку.

public void Configuration(IAppBuilder app) 
{ 
    LoggingConfig.ConfigureLogger(); 

    HttpConfiguration httpConfiguration = GlobalConfiguration.Configuration; 

    GlobalConfiguration.Configure(WebApiConfig.Register); 

    var container = IoC.Initialize(); 
    httpConfiguration.DependencyResolver = new StructureMapResolver(container); 

    ConfigAuth(app);  

    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);   

    Log.Logger.ForContext<Startup>().Information("======= Starting Owin Application ======"); 
} 
+0

Повторно сделал заказ на WebApiConfig, добавил оба параметра конфигурации в файл запуска и удалил маршрут «все». К сожалению, я все еще получаю ту же ошибку, контроллер не распознается. Это происходит при доступе к ** api/inventoryonhand **, а также к предыдущему ** api/inventoryonhand/all ** – Thomas

+0

И вы говорите, что все остальные контроллеры работают правильно? Покажите полный URL-адрес, который вы вызываете, и корневой URL-адрес сайта. – Nkosi

+0

Да. Проект старый, и мы больше не можем говорить с оригинальным dev, но код похож на другие определенные маршруты. Просто не понимаю, почему этот не работает. – Thomas

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