web-dev-qa-db-ja.com

MVC5のWEBAPIとエリアを使用したURLルーティング

私はMVC5アプリケーションに取り組んでいます。その中で私はOrganizationという名前のエリアを作成しました。また、そのエリアのコントローラーフォルダーに(API)フォルダーを作成しました。だから私の構造は次のようになりました

/Areas/Organization/Controllers/API/OrganizationAPI

ここで、OrganizationAPIOrganizationエリアのAPIコントローラーです。今私の問題はMVCでのルーティングに関するものです。 APIを呼び出すURLが見つかりません。

このURLで試してみました

http://localhost:80/Organization/API/OrganizationAPI/getData

ここで、getDataは私のアクションメソッドです。しかし、リソースが見つからないと表示されます。自分のルートを登録して、アクションをURLにマッピングし、MVC4以降のURLルーティングの参照URLを提案する方法を理解するのに役立ちますか?.

11
Ankush Jain

プロジェクトにすでにWebApiConfig.csファイルが含まれている場合は、すばらしいです。以下のようなルートを追加する必要があります。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

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

        // NEW ROUTE FOR YOUR AREA
        config.Routes.MapHttpRoute(
            name: "API Area Default",
            routeTemplate: "api/AREA/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
9
Jason Foglia

エリアをエミュレートする別のルートを作成することもできますが、これは「名前空間」の概念だけではうまく機能しません。あるエリアのコントローラーに別のエリアからアクセスできることがわかります。これは、MVCルーティングのように「AREA」がWebAPIで実際に考慮されていないためです。

したがって、異なる領域に同じ名前のコントローラーがある場合、例外がスローされます。

「チケット」という名前のコントローラーに一致する複数のタイプが見つかりました。これは、このリクエストを処理するルート( ‘api/{controller}/{id}’)が、サポートされていない、同じ名前で異なる名前空間で定義された複数のコントローラーを検出した場合に発生する可能性があります。 「チケット」のリクエストにより、一致する次のコントローラーが見つかりました:...。

私にとっての解決策は、MartinDevillersブログからのこのエレガントな回避策に従うことでした。

http://blogs.infosupport.com/asp-net-mvc-4-rc-getting-webapi-and-areas-to-play-nicely/

ここまでは順調ですね!

1
iMarrero

APIコントローラー用に作成されたデフォルトルートは、通常のコントローラーとは異なり、メソッド名(この場合はgetData)を考慮しません。これは、httpメソッド(get/post/put/delete)と送信するパラメーターによって異なります。アクションメソッドは、httpメソッド名と同じもので開始する必要があります(たとえば、getDataは、getメソッドが使用されるときに呼び出されます)。

名前でAPIコントローラーのアクションを呼び出すカスタムルートを追加できます。

したがって、get dataメソッドを呼び出すには、URLは次のようになります。 エリア/ API /コントローラー、メソッド名を追加しないでください。

1
A Khudairy