2016-06-28 19 views
1

私はWeb APIを使用してC#プロジェクトを持っています。私は私のコントローラのための私のプレフィックスとルーティングを定義しましたが、私は「すべての」ルートにアクセスしようとしたときにエラーを受信し続ける: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で注文を再実行し、スタートアップファイルの両方の設定オプションを追加し、 "all"ルートを削除しました。残念ながら、私はまだ同じエラーが発生し、コントローラが認識されていません。これは、** api/inventoryonhand **にアクセスすると、以前の** api/inventoryonhand/all ** – Thomas

+0

にアクセスしたときに発生し、他のすべてのコントローラーが正常に動作しているとしますか?呼び出している完全なURLとサイトのルートURLを表示します。 – Nkosi

+0

はい。プロジェクトは古く、もはや元の開発者と話すことはできませんが、コードは定義されている他のルートと似ています。なぜこれが動作していないのかわかりません。 – Thomas

関連する問題