37

asp.net 4 RCサイトにWebAPIサポートを追加しようとしていますが、それを領域に配置したいと考えています。誰かがこれをベータ版(ここ)で実行することに成功したのを見たことがありますが、正直なところ、私がRCで何をしているのかわかりません。

誰かがWebAPIのRCにエリアサポートを追加することに成功しましたか?

4

5 に答える 5

62

Apiコントローラーは任意のフォルダーに配置できます。MVCの場合のようにエリアを作成する必要はありません。私が通常行うことは、MVCサイトの「Controllers」フォルダー内にサブフォルダー「Api」を作成することです。Apiコントローラーのルートを登録するだけで機能します。

于 2012-06-18T07:18:53.603 に答える
24

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コントローラーをApiareaフォルダー内のフォルダー内に格納しますが、どこに配置してもかまいません。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.

于 2014-02-20T15:16:29.597 に答える
13

ASP.NET MVC 4は、エリアでWebAPIをサポートしていません。

これを行うために拡張DefaultHttpControllerSelectorすることは可能ですが、この優れた(そして短い)記事を注意深く読む必要があります:ASP.NET MVC 4 RC:WebApiとエリアをうまく​​再生するために。それは素晴らしい働きをします。

私はこのソリューションをポータブルエリア(MVCContrib)で正常にテストしました。基本的に、次のことを行う必要があります。

  • 拡張メソッド「AreaRegistrationContextExtensions」をPAプロジェクトに配置します(PortableAreaRegistration.RegisterArea()メソッドから必須):静的クラスをPAプロジェクトにコピーできますが、共有プロジェクトに配置することをお勧めします。
  • クラス「AreaHttpControllerSelector」(から継承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"; }
        }
    }
}
于 2012-07-17T17:41:33.253 に答える
4

デフォルトルートの前にAPIルートを登録してください。そうしないと、デフォルトルートがすべてを貪欲にキャプチャします。

于 2012-06-18T18:46:41.543 に答える
2

完成のために、次の属性が存在します。これは、人々が束縛から抜け出すのに役立つ可能性があります(上記の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

于 2013-10-29T15:24:18.797 に答える