2016-11-25 33 views
1

Ich habe ein Problem mit WebApi werfen 404 Fehler für meine Routen. Ein Beispiel für eine Steuerung ist:WebAPI Attribut Routing funktioniert nicht in 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-Anfragen an https://api.testdomain.com/test/categories/hello oder https://api.testdomain.com/test/categories/1 werfen beide 404 Not Found Fehler. Die App wird auf IIS (nicht IIS Express) ausgeführt. 404 ist ein IIS 404, der angibt, dass die App gestartet wird, aber das Routing schlägt fehl. Ich habe Haltepunkte in startup.cs angebracht und es wird definitiv getroffen.

Meine startup.cs Datei enthält:

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 
    } 

Mein global.asax enthält:

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

WebApiConfig.cs wie folgt aussieht:

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

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

    } 
} 

Ich habe die folgenden Pakete installiert:

<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" /> 

Ich habe keine Ahnung, warum das Routing nicht funktioniert. Es ist Code-Portierung von anderen Projekten, und der Ansatz (d. H. Der Code in startup.cs usw.) ist das gleiche wie die Arbeitsprojekte.

Ich gehe im Kreis so jede Hilfe dankbar erhalten.

+0

Wo ist die Standardroute in Ihrem 'Register' Methode? Etwas wie 'config.Routes.MapHttpRoute (Name:" DefaultApi ", routeTemplate:" api/{Controller}/{id} ", Standard: neu {id = RouteParameter.Optional}); ' –

+0

Haben Sie den ExtensionlessUrlHandler zu Ihrem Handler-Abschnitt in web.config hinzugefügt? Hier ein Beispiel: http://stackoverflow.com/questions/9703090/http-404-page-not-found-in-web-api-hosted-in-iis-7-5 – Schadensbegrenzer

+0

@RaviA. Es verwendet Attribut-Routing, so dass die Standardroute, wie Sie sie geschrieben haben, nicht benötigt wird. – Graham

Antwort

0

Sie vermischen die Konfiguration des HttpConfiguration-Objekts mit IIS und OWIN. Es ist entweder das eine oder das andere. die Verwendung beider wird einen Konflikt verursachen.

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 bleibt gleich

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