0

Web Api をエリアと共に使用するように構成された作業中の Web アプリケーションがあります。管理者とクライアントの 2 つの領域があります。つまり、コントローラーをターゲットにするには、次のように URL を呼び出す必要があります。

/xxxWebClient/api/1.0.0/projectid/製品

すべてが正常に動作します。これは私の routeConfig です:

//Route to Client
        routes.MapRoute(
           name: "Client",
           url: "Client",
           defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
           namespaces: new string[] { "xxx.Web.Areas.xxxWebClient.Controllers" }
       ).DataTokens.Add("Area", "xxxWebClient");

        //Route to Admin
        routes.MapRoute(
           name: "Admin",
           url: "Admin",
           defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
           namespaces: new string[] { "xxx.Web.Areas.xxxWebAdmin.MvcControllers" }
       ).DataTokens.Add("Area", "xxxWebAdmin");

同じコントローラーを対象とするように、odata を有効にしたいと考えています。問題は、メソッドに [Queryable] 属性を追加するだけで利用できる Odata WebAPI 機能を使用するだけでなく (そしてうまく機能する)、コントローラーを新しい AsyncEntitySetController に拡張する必要があることです。 odata url を呼び出すときに自動的に生成される QueryOptions を取得して使用します。私はすでに最新の nuGet パッケージ (odata、edm、および空間) を持っています。プロジェクトをコンパイルするには、これらのアセンブリ バインディング リダイレクトを web.config に追加する必要がありました。

<dependentAssembly>
    <assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.4.0.0" newVersion="5.4.0.0" />
  </dependentAssembly>      
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.4.0.0" newVersion="5.4.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Spatial" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.4.0.0" newVersion="5.4.0.0" />
  </dependentAssembly>

次に、このコードを Global.asax 内に追加しました (ページが読み込まれるたびに通過させるために、現在は Application_BeginRequest() にあり、Application_Start メソッド内にあります):

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
            modelBuilder.EntitySet<Product>("Products");

            Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
            try { 
                GlobalConfiguration.Configuration.Routes.MapODataRoute("ODataRoute", "xxxWebClient/api/1.0.0/projectid", model); 
            }

ポイントは、odata コントローラーの URL をターゲットにすると、406 (受け入れられない) ステータス コードが返されることです。(たとえば、「xxxWebClient/api/1.0.0/projectid/Products」)。

私のコントローラーの定義は次のようなものです:

public class ProductsController : AsyncEntitySetController<Product, string>
{

この AsyncEntitySetController を空のテスト プロジェクトで正常にテストしました。これを Areas と統合できるようにしたいと考えています。どんなアイデアでも大歓迎です。ありがとう。

4

1 に答える 1