asp.net 4 RCサイトにWebAPIサポートを追加しようとしていますが、それを領域に配置したいと考えています。誰かがこれをベータ版(ここ)で実行することに成功したのを見たことがありますが、正直なところ、私がRCで何をしているのかわかりません。
誰かがWebAPIのRCにエリアサポートを追加することに成功しましたか?
asp.net 4 RCサイトにWebAPIサポートを追加しようとしていますが、それを領域に配置したいと考えています。誰かがこれをベータ版(ここ)で実行することに成功したのを見たことがありますが、正直なところ、私がRCで何をしているのかわかりません。
誰かがWebAPIのRCにエリアサポートを追加することに成功しましたか?
Apiコントローラーは任意のフォルダーに配置できます。MVCの場合のようにエリアを作成する必要はありません。私が通常行うことは、MVCサイトの「Controllers」フォルダー内にサブフォルダー「Api」を作成することです。Apiコントローラーのルートを登録するだけで機能します。
WebAPIURLのサポート領域
WebAPIルートを登録するだけです。
ただし、このルートは他のルートの前に登録する必要があります。そうでない場合、Web APIへのリクエストは、MVCアクションであるかのように誤って処理されます。
エリアを使用する場合、エリアルートの登録は通常、非エリアルートの登録前に行われることを考慮に入れる必要があります。つまり、Global.asax Application_Start
次の順序で次のコード行があります。
AreaRegistration.RegisterAllAreas();
// ...
RouteConfig.RegisterRoutes(RouteTable.Routes);
最初のメソッド呼び出しはRegisterArea
、見つかったすべてのxxxAreaRegistration
クラスのメソッドを呼び出します。そして、この構成の中には、通常、次のようなものがあります。
context.MapRoute(
"AreaName_default",
"AreaName/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
この領域内にWebAPIコントローラーを配置する場合は、次のように、このルートの前にWebAPIルートを追加する必要があります。
context.Routes.MapHttpRoute("AreaName_WebApiRoute",
"AreaName/Api/{controller}/{id}",
new { id = RouteParameter.Optional });
この場合、次のようなURLを使用してAPIコントローラーを呼び出すことを想定しています/AreaName/Api/ControllerName/Id
。
私は通常、Web APIコントローラーをApi
areaフォルダー内のフォルダー内に格納しますが、どこに配置してもかまいません。APIコントローラーはどこにいても検出されることを考慮してください。異なる領域で同じ名前を使用すると、競合が発生します。完全修飾(名前空間)ではなく、クラス名で検出されます。名前。
簡単に言うと、エリアは実際にはサポートされていませんが、エリア内の独自のフォルダーに含めて、エリア内のMVCコントローラーのようなURLで使用できるようにすることができます。
ルートネームスペースのサポート
What if you want to have Web API controllers with the same name in different areas? If you really want to give real support for areas to Web API controllers, you have to implement and register a custom IHttpControllerSelector.
You have a good explanation, and a sample implementation here: ASP.NET Web API: Using Namespaces to Version Web APIs
This sample uses namespaces for versioning, but the code can be slightly modified to support areas namespaces.
ASP.NET MVC 4は、エリアでWebAPIをサポートしていません。
これを行うために拡張DefaultHttpControllerSelector
することは可能ですが、この優れた(そして短い)記事を注意深く読む必要があります:ASP.NET MVC 4 RC:WebApiとエリアをうまく再生するために。それは素晴らしい働きをします。
私はこのソリューションをポータブルエリア(MVCContrib)で正常にテストしました。基本的に、次のことを行う必要があります。
PortableAreaRegistration.RegisterArea()
メソッドから必須):静的クラスをPAプロジェクトにコピーできますが、共有プロジェクトに配置することをお勧めします。DefaultHttpControllerSelector
)をホストプロジェクトに追加します。Global.asax App_Start()に次の行を追加します。
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector)、new AreaHttpControllerSelector(GlobalConfiguration.Configuration));
の実装には注意点が1つありAreaHttpControllerSelector
ます。エリア名はApiControllerの名前空間に対応している必要があります。たとえば、これは私のPortableAreaRegistration
クラスです。
namespace PortableAreasSample.MembershipArea
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MvcContrib.PortableAreas;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;
public class MembershipRegistration : PortableAreaRegistration
{
public override void RegisterArea(System.Web.Mvc.AreaRegistrationContext context, IApplicationBus bus)
{
// GET /MembershipArea/GetAllUsers
context.MapHttpRoute("MembershipApi",
AreaName + "/{controller}/{id}",
new { area=AreaName, controller = "GetAllUsers", id = RouteParameter.Optional });
}
public override string AreaName
{
get { return "MembershipArea"; }
}
}
}
デフォルトルートの前にAPIルートを登録してください。そうしないと、デフォルトルートがすべてを貪欲にキャプチャします。
完成のために、次の属性が存在します。これは、人々が束縛から抜け出すのに役立つ可能性があります(上記のericのアドバイスに従わない人...)
[Route ("api/interesting/{id?}")]
[RoutePrefix("api/interesting")]
http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2