问题标签 [asp.net-web-api-odata]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
691 浏览

odata - asp.net web api:相对网址

我正在从 wcf 数据服务迁移到 asp.net web api odata,并且在使用相对 URL 时遇到问题。我正在尝试实现本文中描述的功能(添加实体之间的关系):

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/entity-relations-in-odata-v4

我不知道这是否是由于 odata 协议 v4 的协议规范造成的,但是使用相对 URL 绝对可以使用 odata v3 和 wcf 数据服务。

问题是,如果您在反向代理后面,那么绝对 url 不起作用。如果您在请求中指定相对 URL

你会得到一个例外,明确指出相对 url 只允许与 odata 上下文结合使用——所以无论哪种方式,你都必须知道绝对 URL。是否有解决方案可以解决此问题并使用相对 URL?至少:这如何与负载平衡器、反向代理等结合使用?

更新

如我所见,即使没有 odata 上下文,也应该可以使用相对 URL(形成 odata v4 规范http://docs.oasis-open.org/odata/odata-json-format/v4.0/cs01/odata-json-format -v4.0-cs01.html#_Toc365464682):

有效载荷(无论是请求还是响应)中的 URL 可以表示为相对 URL。

如果上下文 URL 存在于与相对 URL 或封闭对象相同的 JSON 对象中,则相对 URL 相对于下一个上下文 URL。此规则也适用于上下文 URL;它们可以相对于封闭对象的上下文 URL。

如果请求中不存在上下文 URL,则相对 URL 是相对于请求 URL 的。

如果响应中不存在上下文 URL,则相对 URL 是相对于响应的 Content-Location 标头的。

在没有 Content-Location 标头或上下文 URL 的响应中,相对 URL 是相对于请求 URL 的。

扩展 URL 的处理器必须使用 [RFC3986] 中定义的正常 URL 扩展规则。这意味着如果基本 URL 是上下文 URL,则在解析相对 URL 时会忽略以 $metadata# 开头的部分。


有没有其他人从 wcf 数据服务迁移到 web api odata 并且知道一些好的资源来阅读?AFAIK 承诺要开源 WCF 数据服务,那发生了什么?

0 投票
1 回答
4251 浏览

odata - 如何更新实体及其子项?补丁方法不起作用

我必须使用其子列表更新我的实体,如下所示:

我以这种方式实现了补丁方法:

但是当我尝试以这种方式从提琴手调用它时:

它在 Model.isValid 属性中给出错误并指定返回此错误:

无法将 PATCH 应用于实体类型“Entity1”上的导航属性“ChildrenList”。

我该如何解决?补丁方法是正确使用的方法吗?

0 投票
0 回答
159 浏览

c# - Derived 使用 ODataRoute 时无法路由到 BaseController 中的方法

我在路由到我BaseController定义 extra[ODataRoute]的 for 控制器时遇到问题。

  • 获取~/odata/Foos WORKS
  • 获取 ~/odata/Foos(1)工作
  • 获取 ~/odata/Foos(1)/Bars WORKS
  • GET ~/odata/Bars 404 未找到

基本控制器

控制器

此外,我尝试采用约定方式。但这也行不通。

0 投票
2 回答
735 浏览

c# - 在 .NET 中设计用于 Web API 的相关业务实体的最佳方法是什么?

我正在尝试在 .NET 中设计业务实体,如下所示,这些实体将通过 Web API/oData 公开。

业务实体 1:“车辆”,具有以下属性:

  • VehicleId 字符串
  • 型号 ID 字符串

业务实体 2:“模型”,具有以下属性:

  • 型号 ID 字符串
  • 型号描述字符串

现在,如果有人使用我的 Web API 仅获取车辆信息并且还想显示模型描述,那么他们需要进行 2 次 HTTP 调用,这将导致性能下降,特别是在慢速网络中。在这种情况下,我想知道加载和建模嵌套业务实体的最佳方法是什么,这将通过 Web API 提供最佳性能?

我应该如下建模我的 Vehicle 类吗?这真的是 REST/Web API 设计的好习惯吗?对于以下方法,实体似乎也因为包含实体而变得太重。请指教。

业务实体 1:“车辆”,具有以下属性:

  • VehicleId 字符串
  • 型号 ID 型号
0 投票
1 回答
234 浏览

asp.net-web-api - Created(entity) 使用复合键抛出异常

我有一个MyEntity使用复合键的实体 ()。

实体被发布和插入就好了,但是当Created()被调用时它会抛出一个InvalidOperationException带有消息的。

实体集“MyEntity”的编辑链接构建器返回 null。位置标题需要编辑链接。

0 投票
1 回答
916 浏览

asp.net-web-api - OData WebAPI,内存可查询和区分大小写

我在使用 OData WebAPI 并查询一个EnumerableQuery(我调用的列表)时遇到问题.AsQueryable()。我有一个实体集,一个带有 Get 方法的控制器,该方法返回IQueryable。当我查询该实体集并使用此 $filter

我只得到字母和大小写SomeStringProp相等的实体。'SomeValue'我想以某种方式强制 OData 对所有字符串使用不区分大小写的比较器 - 即使使用这样的函数调用

我需要 OData 返回 SomeStringProp 等于的实体'APPLE''PineApple'并且'AppleSauce'

一些附加信息:

  • 数据库与此无关;如前所述,该集合在内存中
  • 在 OData 查询中使用 tolower() 只是一种解决方法,因此它不是解决问题的方法
0 投票
1 回答
2159 浏览

c# - 不是有效的 Odata 路径模板

我正在尝试创建满足 url 之类的 Odata 方法

域:端口/产品/100/RedirectUrl()

但我有例外

控制器“产品”中操作“RedirectUrl”的路径模板“{id}/RedirectUrl()”不是有效的 OData 路径模板

我的 Webapi 配置包含

有什么办法可以做到这一点?

0 投票
1 回答
1094 浏览

c# - 与 WebAPI OData v4 的一对零或一对一关系

我正在使用 Entity Framework 4.3 并首先编写代码。我有两个表处于 1 到 0 或 1 的关系,就像这样......

我还在使用带有 OData v4 的 ASP.Net WebAPI 2.2 和 OData 客户端代码生成器模板。

WebAPI 创建的元数据文件缺少IsNullable="False"用户属性的UserID属性。因此,OData 客户端代码生成器使 User 类的UserID属性可以为空,这是不正确的,尤其是在它是主键的情况下。

我已经尝试添加[Required]到 UserStats 上的属性,但是如果我在保存/更新类时User不包含 a ,那么任何更新都会引发验证异常。UserUserStats

我觉得我错过了什么。

0 投票
1 回答
1317 浏览

c# - 如何将表值函数公开为 Web Api 2 OData v4 服务中实体集的属性?

请帮助我弄清楚如何将表值函数公开为 Web Api 2 OData v4 服务中实体集的属性。

我的简化架构包含三个表,即 Structures、Locations 和 LocationLinks。一个结构包含一个带有节点(Locatons)和边(LocationLinks)的图。我使用 Entity Framework 6 Database 第一个模型进行访问。

目标是访问 LocationLinks 的结构集合,就像我访问结构的位置一样。即请求结构#180的图表:

Locations 查询自动运行,但我不知道如何添加正确的路线以启用 LocationLinks 查询。认为这会使我的任务更轻松,我在我的 SQL 服务器中添加了一个表值函数。该函数存在于我的 EF 模型中,并返回 LocationLink 实体的集合:

不幸的是,无论我尝试什么,我似乎都无法使 Structure(180)\LocationLinks URL 正常工作。这是我最近的尝试:

StructuresController.cs 片段:

WebApi.cs 片段:

我收到的错误是:

{ "error":{ "code":"","message":"没有找到与请求 URI ' http://.../OData/Structures(180)/LocationLinks '匹配的 HTTP 资源。"," innererror":{ "message":"没有找到路由约定来为带有模板 '~/entityset/key/unresolved' 的 OData 路径选择一个操作。","type":"","stacktrace":"" } } }

基于一些搜索,我尝试向控制器添加 ODataRoute 属性:

导致此错误:

控制器“结构”中操作“GetLocationLinks”的路径模板“结构({key})/LocationLinks”不是有效的 OData 路径模板。在 OData 路径模板“结构({key})/LocationLinks”中找到未解析的路径段“LocationLinks”。

如何从 Structures 集合中公开 LocationLinks?感谢您的时间。

编辑:

找到这个问题后,我设法让它工作: Adding a custom query backed Navigation Property to ODataConventionModelBuilder

我必须在我的 ODataConventionBuilder 对象上调用 .GetEdmModel,然后使用此函数将导航属性添加到模型中:

我现在遇到的问题是我在查询中访问导航属性的能力有限。例如此链接有效:

虽然这没有。

返回的错误是

{ "error": { "code":"","message":"发生错误。","innererror": { "message":"实例属性 'LocationLinks' 没有为类型 'ConnectomeDataModel.Structure' 定义", "type":"System.ArgumentException","stacktrace":" at System.Linq.Expressions.Expression.Property(Expression expression, String propertyName)\r\n at System.Web.OData.Query.Expressions.SelectExpandBinder .CreatePropertyValueExpressionWithFilter(IEdmEntityType elementType, IEdmProperty property, Expression source, FilterClause filterClause)\r\n at System.Web.OData.Query.Expressions.SelectExpandBinder.BuildPropertyContainer(IEdmEntityType elementType, Expression source,字典2 propertiesToExpand, ISet1 propertiesToInclude, ISet1 autoSelectedProperties, Boolean isSelectingOpenTypeSegments)\r\n at System.Web.OData.Query.Expressions.SelectExpandBinder.ProjectElement(Expression source, SelectExpandClause selectExpandClause, IEdmEntityType entityType)\r\n at System.Web.OData.Query.Expressions.SelectExpandBinder.Bind(IQueryable queryable)\r\n at System.Web.OData.Query.ODataQueryOptions.ApplySelectExpand[T](T entity, ODataQuerySettings querySettings)\r\n at System.Web.OData.Query.ODataQueryOptions.ApplyTo(IQueryable query, ODataQuerySettings querySettings)\r\n at System.Web.OData.EnableQueryAttribute.ExecuteQuery(Object response, HttpRequestMessage request, HttpActionDescriptor actionDescriptor)\r\n at System.Web.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)\r\n at System.Web.Http.Filters.ActionFilterAttribute.OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n at System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() \r\n 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()" } } }

0 投票
2 回答
1071 浏览

c# - 控制 $expand 请求返回的内容

因此,使用ODataController,您可以控制如果有人这样做会返回什么/odata/Foos(42)/Bars,因为您将被调用,FoosController如下所示:

但是,如果您想控制有人这样做时返回的内容/odata/Foos?$expand=Bars怎么办?你怎么处理那件事呢?它触发了这个方法:

而且我认为它只是.Include("Bars")IQueryable<Foo>您返回的那个有作用,所以...我如何获得更多控制权?特别是,我如何以不破坏 OData 的方式进行操作(即 $select、$orderby、$top 等继续工作。)