2

我正在使用 Web Api 和 ODataController 开发 OData 查询库。当我从网络浏览器运行我的 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

4

您正在从您的方法中返回ActionStepDisplay,但在构建器中您将ActionStep指定为实体。

响应标头中可能不可接受 (406)

于 2015-06-24T09:38:32.273 回答
0

可能问题出在 MediaFormatter 上,它在控制器完成后被调用。当媒体类型格式化程序遇到引用循环(其中对象 A 引用 B 和 B 引用 A)时,您需要告诉媒体类型格式化程序如何处理它,所以在 Json 媒体类型格式化程序中,您可以执行类似...

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

在此处查看文档

我建议您使用 Fiddler 来查看实际情况。你说你没有在浏览器中得到响应,那么返回什么 HTTP 代码?您可以使用 Fiddler 找出...

于 2013-07-01T19:28:00.977 回答