web-dev-qa-db-ja.com

asp.net webapi 2属性ルーティングが機能しない

.NET Framework 4.5を使用して、mvc4と共にVisual Studio 2012をインストールしています。ここで、属性の書き込みでwebapi2を使用し、hlepページですべてのエンドポイントを適切に表示するようにします。

私のソリューションでは、新しいmvc4ベースのemtpyプロジェクトを追加し、nugetを使用してmvc5にアップグレードし、webapi2パッケージをインストールしました。最後に、webapi2のヘルプパッケージをインストールしました。

routeprefixを使用すると、ヘルプページにコンテンツが表示されず、ブラウザーでwebapiエンドポイントにアクセスしようとすると、次のエラーがスローされます。

http://expressiis.com/api/v1/

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


    }
}
33
najam

情報に基づいて、httpConfig.MapHttpAttributeRoutes()を呼び出していないように見えます(これを必ず呼び出してくださいbefore従来のルーティング登録)

MapHttpAttributeRoutesを呼び出していないため、リクエストは従来のルートに一致しているようです。たとえば、api/{controller}。従来のルートに一致するルートには、属性ルートで装飾されたコントローラー/アクションが表示されないため、これは機能しません。

48
Kiran Challa

私が遭遇した問題は、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);
}
34
Josh C

私もこの問題を抱えていて、長い検索の後、_System.Web.Mvc.RouteAttribute_の代わりに_System.Web.Http.RouteAttribute_を使用していることに気付きました。これを修正してconfig.MapHttpAttributeRoutes() everything worked fine.を使用した後

17
Kevin.Debeil

サンプルコードから明らかなように、これはあなたのケースではありませんでしたが、コントローラークラス名の最後をControllerにしてください。

それ以外の場合は、config.MapHttpAttributeRoutes();によって取得されません。

11
user3638471

この質問には既に回答が選択されています。しかし、自分には別の解決策があり、選択した答えが役に立たない場合は返信すると役立つと思います。

私にとってそれはばかげた間違いでした。 2つのコントローラーがありましたが、1つだけが機能していました。解決策は、コントローラークラスの名前が不適切だったことです!

私の働くコントローラー

public class FooController : ApiController { }

稼働していないコントローラー

public class BarControllers : ApiController { }

コントローラークラスがControllerで終わっていることを確認してください。末尾のsが私を見つけました!

4
micah

私の場合、VSは名前でコントローラを作成します

TestController1

名前の最後にこの番号を「1」と付けた理由はわかりませんが、削除して機能します。

0
Paulo

同じ名前の2つのコントローラーがないことを確認してください! Webサイトに捨てていた1つのアセンブリからいくつかのコントローラーを移動していました...一方、Webサイトには古いアセンブリへの参照がなく、他のアセンブリはWebSite binフォルダーにコピーされていました。ルートディスカバリプロセスは、同じコントローラの2つのオカレンスに遭遇したときに、静かに失敗したように見えました!

0
Phil