2016-11-25 54 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/hellohttps://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(name:“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

您正在使用IIS和OWIN混合配置HttpConfiguration对象。它是一个或另一个。使用两者都会导致冲突。

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