私はMVC5アプリケーションに取り組んでいます。その中で私はOrganization
という名前のエリアを作成しました。また、そのエリアのコントローラーフォルダーに(API)フォルダーを作成しました。だから私の構造は次のようになりました
/Areas/Organization/Controllers/API/OrganizationAPI
ここで、OrganizationAPI
はOrganization
エリアのAPIコントローラーです。今私の問題はMVCでのルーティングに関するものです。 APIを呼び出すURLが見つかりません。
このURLで試してみました
http://localhost:80/Organization/API/OrganizationAPI/getData
ここで、getData
は私のアクションメソッドです。しかし、リソースが見つからないと表示されます。自分のルートを登録して、アクションをURLにマッピングし、MVC4以降のURLルーティングの参照URLを提案する方法を理解するのに役立ちますか?.
プロジェクトにすでに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 }
);
}
}
エリアをエミュレートする別のルートを作成することもできますが、これは「名前空間」の概念だけではうまく機能しません。あるエリアのコントローラーに別のエリアからアクセスできることがわかります。これは、MVCルーティングのように「AREA」がWebAPIで実際に考慮されていないためです。
したがって、異なる領域に同じ名前のコントローラーがある場合、例外がスローされます。
「チケット」という名前のコントローラーに一致する複数のタイプが見つかりました。これは、このリクエストを処理するルート( ‘api/{controller}/{id}’)が、サポートされていない、同じ名前で異なる名前空間で定義された複数のコントローラーを検出した場合に発生する可能性があります。 「チケット」のリクエストにより、一致する次のコントローラーが見つかりました:...。
私にとっての解決策は、MartinDevillersブログからのこのエレガントな回避策に従うことでした。
http://blogs.infosupport.com/asp-net-mvc-4-rc-getting-webapi-and-areas-to-play-nicely/
ここまでは順調ですね!
APIコントローラー用に作成されたデフォルトルートは、通常のコントローラーとは異なり、メソッド名(この場合はgetData)を考慮しません。これは、httpメソッド(get/post/put/delete)と送信するパラメーターによって異なります。アクションメソッドは、httpメソッド名と同じもので開始する必要があります(たとえば、getDataは、getメソッドが使用されるときに呼び出されます)。
名前でAPIコントローラーのアクションを呼び出すカスタムルートを追加できます。
したがって、get dataメソッドを呼び出すには、URLは次のようになります。 エリア/ API /コントローラー、メソッド名を追加しないでください。