2

Web Api と ODataController を使用して OData クエリのライブラリを開発しています。Web ブラウザーから API を実行しようとすると、何も返されません。どんな種類のエラーも発生しません。Visual Studio でデバッグすると、メソッドが実行され、結果が IQueryable<> として正常に返されることがはっきりとわかります。内部のどこかでデータが破棄されています。他の誰かがこれを見たり遭遇したりしましたか? 参照用に以下のコードを含めました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.OData;
using Epm.Core.Model;
using System.Web.Http.OData.Query;
using Epm.Data.Access;
using Epm.Service.Assemblers;

namespace Epm.Service.Web.Controllers.OData
{
    public class SearchActionsController : ODataController
    {
        private readonly EpmEntities context = new EpmEntities();

        [Queryable(AllowedQueryOptions=AllowedQueryOptions.All)]
        public IQueryable<ActionStepDisplay> Get(int planId, int? factorId, bool? showArchived)
        {
            var user = this.GetCurrentUser();

            var results = (from p in context.SearchActions(user.SessionId, planId, factorId, showArchived, 1, null)
                           select p).ToModel().ToArray();

            return results.AsQueryable();
        }

        protected override void Dispose(bool disposing)
        {
            context.Dispose();
            base.Dispose(disposing);
        }
    }
}

私の構成:

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Epm.Core.Model.ActionStep>("SearchActions");

Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
config.Routes.MapODataRoute("ODataRoute", "odata", model);
4

2 に答える 2

0

おそらく問題は、コントローラーの終了後に呼び出される MediaFormatter にあります。メディア タイプ フォーマッタが参照ループ (オブジェクト A が B を参照し、B が A を参照する場所) に遭遇した場合、メディア タイプ フォーマッタにそれを処理する方法を伝える必要があるため、Json メディア タイプ フォーマッタでは次のようなことを行います...

json.SerializerSettings.PreserveReferencesHandling = 
  Newtonsoft.Json.PreserveReferencesHandling.All;

こちらのドキュメントを参照してください

Fiddler を使用して、実際に何が起こっているかを確認することをお勧めします。ブラウザで応答が得られないとおっしゃっていますが、返される HTTP コードは何ですか? Fiddler を使用して調べることができます...

于 2013-07-01T19:28:00.977 に答える