70

APIコントローラーをASP.NETMVC4Webアプリ内で動作させようとしています。しかし、すべてのリクエストは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 / Favoriteを参照すると、 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>

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

4

19 に答える 19

139

私が遭遇したことの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);

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

于 2014-12-15T06:03:28.290 に答える
15

本質的に同じ問題がありましたが、私の場合は次のように追加して解決しました。

<modules runAllManagedModulesForAllRequests="true" />

<system.webServer>

</system.webServer>

web.configのセクション

于 2015-02-24T03:49:33.833 に答える
13

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

基本的に、クラス名の最後に「Controller」のスペルを間違えていました。そのような単純な!

于 2015-04-16T11:49:54.827 に答える
10

次の行を追加します

GlobalConfiguration.Configure(WebApiConfig.Register);

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

于 2016-08-27T16:52:34.467 に答える
7

同じ問題が発生した後、他のプロジェクトでapiコントローラーのクラス名が重複していることがわかりました。「routePrefix」と名前空間とプロジェクト名が異なっていても404が返されましたが、クラス名とそれを変更しました。働いた。

于 2016-12-01T04:16:18.087 に答える
5

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

404を返します:

List<CustomerInvitation> GetInvitations(){

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

public List<CustomerInvitation> GetInvitations(){
于 2017-12-04T20:34:44.467 に答える
3

メソッドのRoute属性を作成します。

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

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

于 2016-10-14T14:52:07.837 に答える
2

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

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

コードはただ座って一晩調理しなければならなかったと思います...:)

助けてくれてありがとう、みんな!

于 2013-03-22T08:03:27.240 に答える
2

理由がはっきりしないので、すべてのメソッド/アクションを静的として宣言しました。これを行うと、機能しないようです。だからただ降ろし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);
}
于 2017-03-02T12:01:48.520 に答える
2

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

于 2018-06-11T07:13:56.917 に答える
1

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

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

于 2016-03-12T22:11:05.803 に答える
1

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

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

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

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

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

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

于 2017-07-02T04:41:29.787 に答える
1
WebApiConfig.Register(GlobalConfiguration.Configuration);

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

于 2017-10-27T02:20:51.953 に答える
0

これを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" />も機能しますが、パフォーマンスの問題があるためお勧めしません。

于 2015-12-05T20:07:44.620 に答える
0

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

于 2016-06-07T11:03:12.120 に答える
0

私は同じ404の問題を抱えていましたが、ここで賛成票を投じた解決策はどれも機能しませんでした。私の場合、独自のweb.configを持つサブアプリケーションがあり、親のhttpModulesweb.configセクション内にクリアタグがあります。IISでは、親のweb.config設定はすべてサブアプリケーションに適用されます。

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

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

<location path="." inheritInChildApplications="false">
  <system.web>
  ....
  <system.web>
</location>
于 2016-07-06T20:37:25.297 に答える
0

さまざまなクライアントを使用してアプリを数十回インストールしましたが、すべて正常に機能しましたが、これはすべてのAPI呼び出しで常に404を返しました。このクライアント用にIISでアプリケーションプールを作成したとき、デフォルトで4.0ではなく.net Framework 2.0に設定されていたため、見逃してしまいました。これにより、404エラーが発生しました。私には、これは500エラーであるはずだったようです。非常に誤解を招くMicrosoft!

于 2020-03-17T22:15:19.520 に答える
0

この問題が発生しました。.NET4.7.2上のWebAPI2プロジェクトが期待どおりに機能していたため、プロジェクトのプロパティを変更して、[Web]タブの[特定のページ]パスを使用しました。それ以来毎回実行すると、404エラーが発生していました。コントローラーにヒットすることすらありませんでした。

解決策:VSソリューションファイルの親ディレクトリ(同じディレクトリの場合もあります)で.vs隠しフォルダーを見つけ、削除しました。VSソリューションをもう一度開き、クリーンアップし、[再構築]オプションを使用して再構築すると、再度実行されました。VisualStudioによって作成されたキャッシュファイルに問題がありました。これらが削除され、ソリューションが再構築されると、ファイルが再作成されました。

于 2020-04-27T23:00:42.743 に答える
0

IISを管理していて、新しいサイトを作成する必要がある場合は、[アプリケーションプール]をチェックして、CLRバージョンを選択する必要があることを確認してください。私の状況では、「マネージコードなし」が選択されていました。v4.0に変更した後、動作を開始しました。

于 2020-09-16T16:17:06.627 に答える