Tag: odata

ODATA是否真的使用Microsoft Web API REST架构?

我越是研究ODATA上的Microsoft框架,我倾向于认为它不适合企业应用程序。 该框架期望所有数据库直接作为ViewModel公开,即使对于像分页和排序这样的简单操作也是如此。 我们将被迫使用强大的机制来保存呈现给JavaScript客户端的页码。 或者我不正确理解微软对OData的影响? 编辑-1: ODATA V4是一个有状态架构吗? 由微软模式团队推动。 我没有看到从Asp.Net Web API(REST)迁移到OData(Sounds STATEFUL)架构的任何简单路径。 编辑-2:分页,排序和分组是来自客户端的传入请求的一部分。

处理Odata / entityset / key / navigation

我们有一个基于ODataSamples-master odata示例的DynamicEdmModelCreation项目的项目。 我们设置了一个路由约定来处理对这个特定控制器的所有请求: [HttpGet] [EnableQuery] public EdmEntityObjectCollection Get() { … } [EnableQuery] public IEdmEntityObject Get(string key) { … } 我们试着举个例子 / odata /酒店 – >好的! / odata /酒店(1) – >好的! / odata /酒店(1)/房间 – >回复: 没有找到路由约定来为模板’〜/ entityset / key / navigation’选择OData路径的操作。 我们看到路由约定很好地处理请求并将其重定向到我们的控制器但没有执行任何方法。 路由公约是: public class MatchRoutingConventionService : IODataRoutingConvention { public string SelectAction( ODataPath odataPath, HttpControllerContext […]

oData中的集合名称列表

我很困惑如何从以下odata服务获取集合名称列表http://services.odata.org/V4/Northwind/Northwind.svc/ 我只想获得服务中所有可用集合名称的列表然后我想让用户选择要查看其信息的集合,然后显示该集合中的项目 例如,以下行访问Customers集合。 var customers = client.For(“Customers”).FindEntriesAsync(); 我可以按如下方式访问每个集合的内部。 static void Main(string[] args) { var client = new ODataClient(“services.odata.org/Northwind/Northwind.svc/”); var customers = client.For(“Customers”).FindEntriesAsync(); foreach (var customer in customers) { Console.WriteLine(customer[“CustomerID”]); } }

WebAPI OData操作示例 – CheckOut和CheckOutMany操作之间的区别

我一直在忙着对T4模板进行自定义,这样我就可以从.NET客户端进行强类型的OData动作调用。 它可能是我创建的第一个开源的东西:) 无论如何,我正在测试和开发针对称为“ODataActionsSample”的OData操作的WebAPI OData示例。 对于那些想在家里玩的人,可以在http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ODataActionsSample/找到样本。 该示例还有几个有趣的操作。 目前我正在尝试支持这两个基于集合的操作,因为我已经控制了其他人。 这两个操作是CheckOut操作(接受$ filter查询的覆盖)和CheckOutMany操作(接受电影ID的集合)。 样本中的代码…… // CheckOut action // URI: ~/odata/Movies/CheckOut // Shows how to bind to a collection, instead of a single entity. // This action also accepts $filter queries. For example: // ~/odata/Movies/CheckOut?$filter=Year eq 2005 var checkOutFromCollection = modelBuilder.Entity().Collection.Action(“CheckOut”); checkOutFromCollection.ReturnsCollectionFromEntitySet(“Movies”); // CheckOutMany action // URI: ~/odata/Movies/CheckOutMany // Shows […]

OData扩展为null

使用OData时,如果正在展开的其中一个属性为null,则会出现此错误。 反正有没有解决这个问题? 我期望的输出是扩展属性为null而不抛出任何exception。 An error has occurred. The ‘ObjectContent`1’ type failed to serialize the response body for content type ‘application/json; charset=utf-8’. System.InvalidOperationException The EDM instance of type ‘[Spawtz.OData.Models.Division Nullable=True]’ is missing the property ‘Id’. System.InvalidOperationException at System.Web.Http.OData.EntityInstanceContext.GetPropertyValue(String propertyName) at System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer.CreateStructuralPro perty(IEdmStructuralProperty structuralProperty, EntityInstanceContext entityInstanceContext) at System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer.CreateStructuralPropertyBag(IEnumerable`1 structuralProperties, EntityInstanceContext entityInstanceContext) at System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer.CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext) at […]

C#ODATA,使用子实体展开N Level

我真的需要你的帮助来实现以下目标: 首先让我向您展示我的数据库数据模型: 1- mebs_schedule=>mebs_ingesta 2- mebs_ingesta=>mebs_ingestadetails 3- mebs_ingesta=>mebs_videoitem 4- mebs_ingesta=>mebs_channel=>mebs_channeltuning 使用下面的URI我可以得到这个树给出一个给定的时间表参考: mebs_schedule=>mebs_ingesta mebs_ingesta=>mebs_ingestadetails mebs_ingesta=>mebs_videoitem mebs_ingesta=> mebs_channel URI = “mebs_schedule({0})?$expand=mebs_ingesta/mebs_videoitem,mebs_ingesta/mebs_ingestadetails,mebs_ingesta/mebs_channel”现在我想获得每个mebs_channel出现的mebs_channeltuning集合。 我花时间在谷歌上找出了这个但是什么都没有。 一些试验性的: mebs_schedule(79)?$expand=mebs_ingesta&expand=mebs_videoitem,mebs_ingestadetails,mebs_channel&expand=mebs_channe.mebs_channeltuning 最后一个问题是有没有办法扩展所有导入的数据模型。 谢谢你的帮助。 环境:VS .NET 2010 / C#4.0

ASP.Net Core + EF + OData V4核心Beta 2

在使用EF配置的ASP.NET Core上有一个相当基本的Web API项目,它可以正常使用Web API。 我正在关注这篇文章转换为使用Odata,我无法让它工作。 我有一个名为customer的父对象,带有2个子对象:Addresses和Person。 我已经播种了数据库,所以我可以看到那里有数据,而Odata端点看起来很好,因为当你启动项目时它会显示实体,odata / $ metadata会按预期显示EDM结构。 我目前唯一的问题是,当我导航到一个URL,例如/ odata / customers时,我收到一个空白屏幕。 在邮递员中,它返回404。 我已经梳理了Lucas的示例项目(我正在阅读的文章),并在网上进行了一些调查,并且看不出我做错了什么。 我确定这是简单/愚蠢的事情,但任何建设性的指导都欢迎:) **编辑**为简单起见,删除了其他代码(并根据反馈)。 如果需要其他信息,请与我们联系。 干杯, 亚当 文件路径:Odata \ BookingsModelBuilder.cs using System; using Microsoft.AspNet.OData.Builder; using Microsoft.OData.Edm; using Bookings_Server.OData.Models; namespace Bookings_Server { public class BookingsModelBuilder { public IEdmModel GetEdmModel(IServiceProvider serviceProvider) { var builder = new ODataConventionModelBuilder(serviceProvider); builder.EntitySet(“addresses”) .EntityType .Filter() // Allow for […]

如何公开具有OData服务的派生类和成员的多层模型?

我正在尝试公开一个可用于OData服务的模型。 我目前采取的方法是: 1)在模型中定义一个类以公开IQueryable集合,例如: public class MyEntities { public IQueryable Customers { get { return DataManager.GetCustomers().AsQueryable(); } } public IQueryable Users { get { return DataManager.GetUsers().AsQueryable(); } } } 2)使用可查询的集合类设置WCF DataService ,例如: public class MyDataService : DataService { public static void InitializeService(DataServiceConfiguration config) { config.SetEntitySetAccessRule(“Customers”, EntitySetRights.All); config.SetEntitySetAccessRule(“Users”, EntitySetRights.All); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } } 我用这种方法遇到了3个问题和/或限制: 1)我无法将任何派生类集合添加到IQueryable列表中。 2)我必须应用IgnoreProperties属性来隐藏从基类型派生的任何成员。 […]

如何在客户端加密OData请求有效负载(DataServiceContext)和在ServerSide上解密请求?

我有一个Windows应用程序使用DataServiceContext消费OData v4 WebAPI。 WebApi通过SSL,但我认为任何人都可以使用像fiddler这样的Web调试工具(在Windows应用程序主机上)来捕获请求,并且可以通过更改请求主体来重新发出请求。 所以,如果我可以使用生产环境中的公钥/私钥加密Windows应用程序中的传出请求的RequestBody ,我还在想。 如果是,我怎么可以? 我是否需要创建自定义DataServiceClientRequestMessage或需要在DataServiceContext中的某处挂钩加密过程。 请求将使用MessageHandler解密。 ServiceStack加密消息传递

如何在C#中针对Odata源动态添加filter到LINQ查询

我有如下查询 var query = (from x in NetworkDevices where x.Name == “blabla1” || x.Name == “blabla2” select x ); 我正在针对Odata端点运行它,因此它有效地转换为以下URL https://targetserver/endpoint.svc/NetworkDevices()?$filter=Name eq ‘blabla1’ or Name eq ‘blabla2’ 所以我想动态添加许多filter…在C#我可以继续添加到我的查询,但这不是动态的。 我想在运行时这样做。 如果我是从Javascript调用它,那么我也可以轻松地更新URL。 我的问题是在C#中如何动态地将这些filter添加到where子句中。 在普通的旧LINQ(像linq 2对象)我可以做这样的事情。 var machines = new string[] { “blabla1” , “blabla2” } ; res1.Where ( x => machines.Contains(x.Name) ).ToArray() 这会起作用,但这对Odata端点不起作用,因为我得到这样的错误。 不支持“包含”方法 所以我认为唯一的方法是动态地,编辑表达式树或其他东西来添加这些filter。 有谁知道怎么做?