2016-11-25 14 views
1

WebApiでルートに404エラーが発生する問題があります。コントローラの例です:https://api.testdomain.com/test/categories/helloまたはhttps://api.testdomain.com/test/categories/1両方に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リクエストは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

web.configのハンドラセクションにExtensionlessUrlHandlerを追加しましたか?ここに例があります: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); 
} 
関連する問題