.NET Framework 4.5を使用して、mvc4と共にVisual Studio 2012をインストールしています。ここで、属性の書き込みでwebapi2を使用し、hlepページですべてのエンドポイントを適切に表示するようにします。
私のソリューションでは、新しいmvc4ベースのemtpyプロジェクトを追加し、nugetを使用してmvc5にアップグレードし、webapi2パッケージをインストールしました。最後に、webapi2のヘルプパッケージをインストールしました。
routeprefixを使用すると、ヘルプページにコンテンツが表示されず、ブラウザーでwebapiエンドポイントにアクセスしようとすると、次のエラーがスローされます。
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://expressiis.com/api/v1/'.
</Message>
<MessageDetail>
No type was found that matches the controller named 'v1'.
</MessageDetail>
</Error>
namespace WebApi.Controllers
{
[RoutePrefix("api/v1")]
public class SubscribersController : ApiController
{
// GET api/<controller>
[Route("")]
[HttpGet]
public IQueryable<string> Get()
{
return new string[] { "value1", "value2" }.AsQueryable();
}
}
}
情報に基づいて、httpConfig.MapHttpAttributeRoutes()
を呼び出していないように見えます(これを必ず呼び出してくださいbefore従来のルーティング登録)
MapHttpAttributeRoutesを呼び出していないため、リクエストは従来のルートに一致しているようです。たとえば、api/{controller}
。従来のルートに一致するルートには、属性ルートで装飾されたコントローラー/アクションが表示されないため、これは機能しません。
私が遭遇した問題は、Application_Start()の順序に関連していました。以下のWeb API構成の順序に注意してください。
これは動作しません
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
これは動作します
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
私もこの問題を抱えていて、長い検索の後、_System.Web.Mvc.RouteAttribute
_の代わりに_System.Web.Http.RouteAttribute
_を使用していることに気付きました。これを修正してconfig.MapHttpAttributeRoutes() everything worked fine.
を使用した後
サンプルコードから明らかなように、これはあなたのケースではありませんでしたが、コントローラークラス名の最後をController
にしてください。
それ以外の場合は、config.MapHttpAttributeRoutes();
によって取得されません。
この質問には既に回答が選択されています。しかし、自分には別の解決策があり、選択した答えが役に立たない場合は返信すると役立つと思います。
私にとってそれはばかげた間違いでした。 2つのコントローラーがありましたが、1つだけが機能していました。解決策は、コントローラークラスの名前が不適切だったことです!
私の働くコントローラー
public class FooController : ApiController { }
稼働していないコントローラー
public class BarControllers : ApiController { }
コントローラークラスがController
で終わっていることを確認してください。末尾のs
が私を見つけました!
私の場合、VSは名前でコントローラを作成します
TestController1
名前の最後にこの番号を「1」と付けた理由はわかりませんが、削除して機能します。
同じ名前の2つのコントローラーがないことを確認してください! Webサイトに捨てていた1つのアセンブリからいくつかのコントローラーを移動していました...一方、Webサイトには古いアセンブリへの参照がなく、他のアセンブリはWebSite binフォルダーにコピーされていました。ルートディスカバリプロセスは、同じコントローラの2つのオカレンスに遭遇したときに、静かに失敗したように見えました!