gpt4 book ai didi

c# - ASP.NET WebAPI : Dynamic object and OData service

转载 作者:太空狗 更新时间:2023-10-29 23:46:09 25 4
gpt4 key购买 nike

我有一个具有动态属性的实体

 public partial class Meeting  //partial class of POCO EF object
{
public dynamic UiPermissions { get; set; }
}

在我的 web api 中,我有一个实现 OData 查询的服务方法

    [Queryable(MaxExpansionDepth = 5)]
[HttpGet("users/{id}/meetings")]
public IEnumerable<Meeting> GetUserMeetings(int id)
{
var meetings = _meetingRepository.GetUserMeetings(id);

// populate dynamic UiPermission
meetings.SetMeetingPermission(_permissionRepository, id);

return meetings;
}

我使用 ExpandoObject 作为 IDictionary 填充动态属性

 public static class PermissionExtensions
{
public static void SetMeetingPermission(this IEnumerable<Meeting> meetings, IPermissionRepository permissionRepository, int userId)
{
// get properties to be created from database table
var permissions = permissionRepository.GetAll();

// create a dynamic object
var uiPermission = new ExpandoObject() as IDictionary<string, Object>;
permissions.ToList().ForEach(p => uiPermission.Add(p.Code, false));

....

}

对API服务的简单调用产生完美的结果

enter image description here

问题

当我使用简单的 ODATA 查询时出现问题

enter image description here

ODATA-展开动态属性返回404

enter image description here

错误的堆栈跟踪(实际上是 404 响应)

{"$id":"1","Message":"The query specified in the URI is not valid.","ExceptionMessage":"Property 'UiPermissions' is not a Navigation Property.","ExceptionType":"Microsoft.Data.OData.ODataException","StackTrace":"   at Microsoft.Data.OData.Query.SyntacticAst.ExpandBinder.GenerateExpandItem(ExpandTermToken tokenIn)\r\n   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()\r\n   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)\r\n   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)\r\n   at Microsoft.Data.OData.Query.SyntacticAst.ExpandBinder.Bind(ExpandToken tokenIn)\r\n   at Microsoft.Data.OData.Query.ODataUriParser.ParseSelectAndExpandImplementation(String select, String expand, IEdmEntityType elementType, IEdmEntitySet entitySet)\r\n   at System.Web.Http.OData.Query.Validators.SelectExpandQueryValidator.Validate(SelectExpandQueryOption selectExpandQueryOption, ODataValidationSettings validationSettings)\r\n   at System.Web.Http.OData.Query.Validators.ODataQueryValidator.Validate(ODataQueryOptions options, ODataValidationSettings validationSettings)\r\n   at System.Web.Http.QueryableAttribute.ValidateQuery(HttpRequestMessage request, ODataQueryOptions queryOptions)\r\n   at System.Web.Http.QueryableAttribute.ExecuteQuery(Object response, HttpRequestMessage request, HttpActionDescriptor actionDescriptor)\r\n   at System.Web.Http.QueryableAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)"}

额外的

WebApiConfig 中,我有关于 json 序列化程序的这一行

 public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
...
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);

...
}
}

有人能指出我在这里遗漏了什么吗?时间差

最佳答案

默认不支持动态类型,因为赋值类型未知。所以类型是未知的,序列化提供者也是未知的。

此链接可能会解决您的问题。 http://loosexaml.wordpress.com/2011/01/01/wcf-serialization-of-dlr-dynamic-types/

关于c# - ASP.NET WebAPI : Dynamic object and OData service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19967942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com