web-dev-qa-db-ja.com

ASP.NET MVC WebAPI 404エラー

Asp.net Webフォームアプリケーションをv4.0統合モードで実行しています。

App_Codeフォルダーにapicontrollerを追加しようとしました。

Global.asaxで、次のコードを追加しました

 RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );

http://localhost/api/Valueのコントローラーに移動しようとすると、404エラーが表示されます。

拡張子のないURLはハンドラーセクションで構成されます。 Webサイトでフォームと匿名認証を有効にしています。

ExtensionLess URLは「*」用に構成されています。

コントローラのURLにアクセスすると、リクエストはExtensionlessUrlHandler-Integrated-4.0ではなくStaticHandlerによって処理されます。

下の図に示すように、システムがエラーをスローする理由は今のところわかりません。 Error

60
Suneel Dixit

この問題が発生していました。

WebApiConfig.csを編集して、ここでのいくつかの推奨事項と他の場所でのコードサンプルを満たしてみました。一部は機能しましたが、WebApiConfig.csがMSテンプレートWebApiプロジェクトに従って正確にコーディングされたときにルートが機能しなかった理由を説明しませんでした。

私の実際の問題は、WebApiをプロジェクトに手動で追加する際に、Global.asaxからの構成呼び出しの在庫順に従わなかったことです。

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        // This is where it "should" be
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        // The WebApi routes cannot be initialized here.
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

これがなぜなのか推測することはできましたが、それ以上調査しませんでした。控えめに言っても直観的ではありませんでした。

110
shannon

問題はルーティング構成にあります。 Mvcルーティングは、WebApiルーティングとは異なります。

System.Web.Http.dllSystem.Web.Http.Webhost.dll、およびSystem.Net.Http.dllへの参照を追加し、次のようにAPIルーティングを構成します。

   GlobalConfiguration.Configuration.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = System.Web.Http.RouteParameter.Optional }
   );
32
Alborz

次のことを確認してください

1.)Web APIがIISに4.5インストール4.5の場合、IISが.NET 4.5または4.0で構成されていることを確認します

管理者権限でコマンドプロンプトでこのコマンドを実行します

C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis.exe -i

2.)ルーティングを変更します

RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );

demo/Getでリクエストを行います(デモはコントローラー名です)

1,2が機能しない場合は3を試してください

3.)web.configファイルに次の構成を追加します

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />

</system.webServer>
17
Binson Eldhose

また、コントローラーが「PizzaPieController」のように「Controller」という名前で終わっていることを確認してください。

10
Eric W.

上記のすべてを試してみましたが、同じ問題がありました。 IISで作成されたアプリケーションプールは、デフォルトで.net 2.0になっていることが判明しました。 4.0に変更すると、再び機能しました

7
Alan

ありがとうシャノン、素晴らしい作品=>

Global.asaxでの注文は次のとおりです。

GlobalConfiguration.Configure(WebApiConfig.Register);  
RouteConfig.RegisterRoutes(RouteTable.Routes);

良いものの代わりに:

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register); 
4
ceinpap

また、api binフォルダーのコンテンツ全体を削除してみてください。私は古いdllを含んでおり(名前空間の名前を変更したため)、競合するコントローラーを公開していました。これらのdllは、Visual Studioのクリーン機能によって削除されませんでした。

(ただし、asp.net web apiには、デバッグレベルでのルーティングおよびデバッグ情報が深刻に欠けていることがわかります)。

3
Simon Budin

App_Codeでコントローラーを作成する場合、ルーティングテーブルはそれがどこにあるかをどのように知るのですか?ルートを「api/{controller/...」として指定しましたが、コントローラーのある場所ではありません。正しいフォルダーに移動してみてください。

2
crunchy

これに何時間も費やした後、私の場合、これに対する解決策を見つけました。

RouteConfigでルートを登録する順序でした。

Defaultコントローラールートの前に、ルートテーブルにHttpRouteを登録する必要があります。次のようになります。 ルート構成ルートテーブル構成

  public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapHttpRoute(
             name: "DefaultApi",
             routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional }
         );
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

    }
}
2
Shri Guru

試行しているURL(http://localhost/api/Value)については、ValueControllerから派生し、次の特性を持つパブリックメソッドを持つApiControllerという名前のパブリックタイプがあることを確認してください。

  • メソッド名はGetで始まります(例:GetValuesまたは単にGet)。
  • メソッドに適用されるHttpGet属性があります。

デフォルトのWeb APIプロジェクトテンプレートからコードを試行する場合、コントローラーの名前はValuesControllerではなくValueControllerであるため、URLはhttp://localhost/api/valuesになります。

上記のいずれにも当てはまらない場合は、 トレースを有効にする を使用すると、パイプラインのどこでエラーが発生したか(およびその理由)を知ることができます。

お役に立てれば。

1
volpav

RouteAttributeベースのコントローラーdllをbinフォルダーにコピーしましたが、有効なコントローラーとして認識されず、クライアントで404エラーが発生していました。

多くのデバッグを行った後、問題が見つかりました。これは、コントローラーが参照しているSystem.Web.Http.dllのバージョンが、メインプロジェクト(global.asax.csを含むプロジェクト)が参照しているSystem.Web.Http.dllのバージョンと異なるためです。

Asp.Netは、このようなコードを使用してリフレクションによってコントローラーを見つけます

internal static bool IsControllerType(Type t)
{
    return
        t != null &&
        t.IsClass &&
        t.IsVisible &&
        !t.IsAbstract &&
        typeof(IHttpController).IsAssignableFrom(t) &&
        HasValidControllerName(t);
}

IHttpControllerSystem.Web.Http.dllのバージョンごとに異なるため、コントローラーとメインプロジェクトは同じ参照を持つ必要があります。

1
tcb

これもありました。NETバージョンを4.5から4.5.1以降に変更すると問題が解決しました

1
Eric Herlitz

次のように、コントローラー名のValue部分のみを使用してみてください。

http://localhost/api/Value

注:慣例により、ルーティングエンジンはコントローラー名として渡された値を取得し、それにWord Controllerを追加します。 URIにValueControllerを入れることで、ルーティングエンジンにValueControllerControllerという名前のクラスを検索させましたが、見つかりませんでした。

0
Karl Anderson

次のリストに馬鹿げた見落としを追加する時間です。webapiのデフォルトルートパスを誤って入力しました。

元の:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/id",
            defaults: new { id = RouteParameter.Optional}
        );

修正:(「id」の周りの中括弧に注意してください)

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional}
        );
0
Mansfield

ルートの構成は良好です。 web.configのハンドラーセクションを再確認してください。統合モードでは、ExtensionLessUrlHandlerを使用する適切な方法です。

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

このトピックの詳細: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx

0
dbalogh

私の場合、ApiControllerから派生させるのを忘れていました。

それは次のようになります

public class ValuesController : ApiController
0
aoakeson

上記の解決策のいずれも私の問題を解決しませんでした...私のエラーは、binファイルを実動サーバーに直接コピーしたことで、その後は動作しませんでした。プロジェクトをディスクに発行し、「発行済み」フォルダーをサーバーにコピーすると、404はなくなりました。それは少し明白ですが、いくつかを助けることができます。

0
Tiago Gouvêa

これは非常に古い質問であることに感謝しますが、将来のユーザーのために別の答えを追加すると思いました。

これは、CI/Stagingに展開された後にのみ作業していたプロジェクトで今起こっていることがわかりました。解決策は、各バージョンを各環境に1回ずつデプロイしながら、コンパイルdebug = "true"値を前後に切り替えることでした。

0
Lari Tuomisto