2016-11-25 6 views
1

У меня проблема с тем, что WebApi выбрасывает 404 ошибки для моих маршрутов. Пример контроллера:Маршрутизация атрибутов WebAPI не работает в OWIN

[System.Web.Http.RoutePrefix("test/categories")] 
public class CategoriesController : ControllerBase 
{ 

    [System.Web.Http.Route("hello")] 
    [HttpGet] 
    [AcceptVerbs("GET")] 
    public IHttpActionResult Get([FromUri] QueryOptions options) 
    { 
     // Usual controller stuff happens here 
    } 

    [System.Web.Http.Route("{id:int}")] 
    [HttpGet] 
    [AcceptVerbs("GET")] 
    public IHttpActionResult GetById(int id) 
    { 
     // Usual controller stuff happens here 
    } 
} 

GET запросы к https://api.testdomain.com/test/categories/hello или https://api.testdomain.com/test/categories/1 как выбросить 404 ошибки не найдены. Приложение работает на IIS (не IIS Express). 404 - это IIS 404, который указывает, что приложение запускается, но маршрутизация не работает. Я привязал точки останова в startup.cs, и он определенно попал.

Мой startup.cs файл содержит:

public void Configuration(IAppBuilder app) 
    {    
     var config = new HttpConfiguration 
     { 
      IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always, 
      DependencyResolver = new SimpleInjectorWebApiDependencyResolver(_container) // _container is a SimpleInjector IoC container; shouldn't affect things. 
     }; 

     WebApiConfig.Register(config); 

     app.UseCors(CorsOptions.AllowAll); 
     app.UseWebApi(config); // Have tried commenting this out with no luck 
    } 

Мои global.asax содержит:

protected void Application_Start(object sender, EventArgs e) 
    { 
     GlobalConfiguration.Configure(WebApiConfig.Register); // Have also tried commenting this out with no luck 
    } 

WebApiConfig.cs выглядит следующим образом:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 

     config.Formatters.Add(new FilePropertyInfoMediaTypeFormatter()); 

    } 
} 

Я установил следующие пакеты:

<package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.WebApi.Cors" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net452" /> 
<package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net452" /> 

Я понятия не имею, почему маршрутизация не работает. Это код, перенесенный из других проектов, и подход (т. Е. Код в startup.cs и т. Д.) Совпадает с рабочими проектами.

Я собираюсь кругами, чтобы любая благодарная благодарность была получена.

+0

Где маршрут по умолчанию в вашем файле 'метода Register'? Что-то вроде 'config.Routes.MapHttpRoute (имя:« DefaultApi », routeTemplate:« api/{controller}/{id} », по умолчанию: new {id = RouteParameter.Optional}); ' –

+0

У вас есть ExtensionlessUrlHandler, добавленный в раздел ваших обработчиков в web.config? Вот пример: http://stackoverflow.com/questions/9703090/http-404-page-not-found-in-web-api-hosted-in-iis-7-5 – Schadensbegrenzer

+0

@RaviA. Он использует маршрутизацию атрибутов, поэтому маршрут по умолчанию, который вы написали, не нужен – Graham

ответ

0

Вы смешиваете конфигурацию объекта HttpConfiguration с IIS и OWIN. Это либо одно, либо другое. использование обоих приведет к конфликту.

WebApiConfig.cs

public static class WebApiConfig { 
    public static void Register(HttpConfiguration config) { 
     config.MapHttpAttributeRoutes(); 

     config.Formatters.Add(new FilePropertyInfoMediaTypeFormatter()); 

     config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

     config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(_container); 
    } 
} 

Startup.cs

public class Startup { 
    public void Configuration(IAppBuilder app) { 
     app.UseCors(CorsOptions.AllowAll); 
    } 
} 

Global.asax остается тем же

protected void Application_Start(object sender, EventArgs e) { 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
} 

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

  • Нет связанных вопросов^_^