web-dev-qa-db-ja.com

すべてのASP.NET Web APIコントローラーは404を返します

ASP.NET MVC 4 Webアプリ内で動作するAPIコントローラーを取得しようとしています。ただし、すべてのリクエストの結果は404になり、困惑します。 :/

プロジェクトテンプレートからの標準APIコントローラールートは次のように定義されています。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

登録はGlobal.asaxで呼び出されます。

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    // Register API routes
    WebApiConfig.Register(GlobalConfiguration.Configuration);

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

次のような基本的なAPIコントローラーがあります。

namespace Website.Controllers
{
    public class FavoritesController : ApiController
    {       
        // GET api/<controller>
        public IEnumerable<string> Get()
        {
            return new [] { "first", "second" };
        }

        // PUT api/<controller>/5
        public void Put(int id)
        {

        }

        // DELETE api/<controller>/5
        public void Delete(int id)
        {

        }
    }
}

localhost:59900/api/Favoritesを参照すると、Getメソッドが呼び出されることを期待していますが、代わりに404ステータスを取得しますコードと次の応答:

<Error>
   <Message>
       No HTTP resource was found that matches the request URI 'http://localhost:59900/api/Favorites'.
   </Message>
   <MessageDetail>
      No type was found that matches the controller named 'Favorites'.
   </MessageDetail>
</Error>

どんな助けでも大歓迎です、私はここで少し気を失います。 :)ありがとう!

58
Ted Nyberg

私が遭遇したことの1つは、たとえば、私の構成をGLobal.asaxファイルに間違った順序で登録することでした。

正しい順序:

AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);

間違った順序:

AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
WebApiConfig.Register(GlobalConfiguration.Configuration);

ちょうど言って、これは私の問題であり、順序を変更することは明らかですが、時々見落とされ、多くのフラストレーションを引き起こす可能性があります。

123
Eric Bishard

本質的に同じ問題がありましたが、私の場合は以下を追加して解決しました:

<modules runAllManagedModulesForAllRequests="true" />

<system.webServer>

</system.webServer>

web.configのセクション

13
Zenilogix

私はこれに似た問題に取り組んでおり、問題を見つけるのに何年もかかりました。これはこの特定の投稿の解決策ではありませんが、これを追加することで、コントローラーで404エラーが発生する理由を探しているときに問題を見つけようとする人の時間を節約できれば幸いです。

基本的に、クラス名の最後の「Controller」の綴りが間違っていました。そのような単純な!

10
user4796368

次の行を追加

GlobalConfiguration.Configure(WebApiConfig.Register);

Global.ascx.csファイル内のApplication_Start()関数内。

10
Farhan Anwar

私は同じ問題を抱えていたので、"routePrefix"と名前空間とプロジェクト名が異なっていたにもかかわらず、404を返したにもかかわらず、他のプロジェクトでAPIコントローラークラス名が重複していることがわかりました。クラス名を変更しましたが、うまくいきました。

4
Aran Dekar

メソッドのルート属性を作成します。

        [Route("api/Get")]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

次のように呼び出すことができます http:// localhost/api/Get

3
Shakeer Hussain

恥ずかしいほど単純なソリューションの同様の問題-APIメソッドがpublicであることを確認してください。メソッドアクセス修飾子を省略すると、HTTP 404も返されます。

404を返します:

List<CustomerInvitation> GetInvitations(){

期待どおりに実行されます:

public List<CustomerInvitation> GetInvitations(){
3
BRass

私は少し困惑していますが、これがHTTP出力キャッシュの問題によるものかどうかはわかりません。

とにかく、「突然正常に動作し始めました」。 :/それで、上記の例は私が何かを追加したり変更したりしなくても機能しました。

コードはただ座って一晩調理する必要があったと思います... :)

助けてくれてありがとう!

2
Ted Nyberg

コントローラークラスに[RoutePrefix( "somepath")]属性がある場合、すべてのコントローラーメソッドにも[Route()]属性が設定されていることを確認します。

私もこの問題に遭遇し、しばらく頭を悩ませていました。

1
Kevin R.

私には明らかでない理由のために、私はすべてのメソッド/アクションを静的として宣言しました-これを行うと明らかに動作しません。したがって、staticをオフにしてください

[AllowAnonymous]
[Route()]
public static HttpResponseMessage Get()
{
    return new HttpResponseMessage(System.Net.HttpStatusCode.OK);
}

なりました:-

[AllowAnonymous]
[Route()]
public HttpResponseMessage Get()
{
    return new HttpResponseMessage(System.Net.HttpStatusCode.OK);
}
1
Morvael

何が起こっているのかを説明せずにweb.configを編集するものが個人的に嫌いなので、ここにソリューションを追加します。

私にとっては、IISでデフォルトのハンドラマッピングがどのように設定されるかでした。これを確認するには...

  1. IIS Managerを開きます
  2. サーバーのルートノード(通常はサーバーの名前)をクリックします。
  3. 「ハンドラーマッピング」を開きます
  4. 右ペインの[アクション]で、[順序付きリストを表示]をクリックします

これは、リクエストを処理するハンドラーの順序です。あなたのものが私のものである場合、「ExtensionlessUrlHandler- *」ハンドラーはすべてStaticFileハンドラーの下にあります。 StaticFileハンドラーには*のワイルドカードがあり、拡張機能のないコントローラーに到達する前に404を返すため、これは機能しません。

したがって、これを再配置し、「ExtensionlessUrlHandler- *」をTRACE、OPTIONS、StaticFileのワイルドカードハンドラーの上に移動すると、Extensionlessハンドラーが最初にアクティブになり、システムで実行されているWebサイトのコントローラーが正しく応答できるようになります。

注:これは基本的に、web.configでモジュールを削除および追加したときに起こることですが、すべてを解決するための1つの場所です。そして、余分なコードは必要ありません!

1
k2snowman69

この問題があった。 Precompile during publishingのチェックを外す必要がありました。

0
user7885142

デバッガーでアプリケーションの初期化にアタッチすることで、同様の問題を解決しました。 Webサーバーを起動して(たとえば、localhostにアクセスする)、w3wpに接続して、アプリの初期化が正常に終了したかどうかを確認します。私の場合、例外があり、コントローラーは登録されませんでした。

0
Pavel
WebApiConfig.Register(GlobalConfiguration.Configuration);

App_startイベントで最初にする必要があります。 APP_startイベントの最後の位置で試しましたが、うまくいきませんでした。

0
Ram

これをweb.configの<system.webServer>に追加します。

<handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
    <remove name="OPTIONSVerbHandler"/>
    <remove name="TRACEVerbHandler"/>
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler"
        preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>

<modules runAllManagedModulesForAllRequests="true" />の追加も機能しますが、パフォーマンスの問題のためお勧めしません。

0
Davoud Zeini

私は同じ404の問題を抱えていましたが、ここで上回ったソリューションはどれもうまくいきませんでした。私の場合、独自のweb.configを持つサブアプリケーションがあり、親のhttpModules web.configセクション内に明確なタグがありました。 IISでは、親のweb.config設定のすべてがサブアプリケーションに適用されます。

<system.web>    
  <httpModules>
    <clear/>
  </httpModules>
</system.web>

解決策は、「clear」タグを削除し、場合によっては、親のweb.configにinheritInChildApplications = "false"を追加することです。 inheritInChildApplicationsは、IISがサブアプリケーションに構成設定を適用しないためのものです。

<location path="." inheritInChildApplications="false">
  <system.web>
  ....
  <system.web>
</location>
0
Hartono Halim