问题标签 [odata-v4]

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 回答
302 浏览

asp.net-web-api - 带有 BindingModel 的 ASP.NET Web API OData v4 Post

我有一个 OData Web API 控制器,它有一个 POST 来插入一个 UserProfile,但是为了不暴露我的数据库实体,我希望 Post 方法接受一个 UserProfileBindingModel。这可能吗?

目前,我的 UserProfiles 中有以下内容:

这是我的 ODataConfig.cs 文件:

UserProfile 在哪里:

UserProfile 的 Fluent API 是:

而 UserProfileViewModel 是:

UserProfileBindingModel 是:

Get 方法工作正常,但使用 post 方法我收到以下消息:

实体类型“UserProfileBindingModel”与提供的实体集“Default.Container.UserProfiles”的基本类型“UserProfile”不兼容。当为 OData 提要或条目阅读器指定实体类型时,它必须与指定实体集的基本类型相同或子类型。

一定有办法做到这一点......有什么想法吗?

干杯

0 投票
1 回答
1880 浏览

odata - 另一个 JSON 对象内的 JSON 对象的 Odata 过滤器

我有一个 odata 服务,它返回一个如下所示的 Json 对象,我想过滤国家/地区的数据。可能吗?

我知道我们可以使用“服务 url?$filter= Gender eq male”按性别过滤它,但我如何按国家/地区过滤它?

0 投票
1 回答
606 浏览

asp.net-web-api - 将计算值添加到 OData 结果

我正在尝试向数据结果添加一些信息,无论用户是否具有对该实体的读取或写入访问权限。

假设我有这个实体:

保存AccessRights用户 ID 的位置以及他们是否具有读/写访问权限。

目前我只是$expandAccessRights 并计算用户是否在前端具有读/写访问权限。但是,我希望将此计算属性添加到结果中。

示例 json 结果:

是否有可能做到这一点?请记住,HasRead/WriteAccess模型上不存在也不应该存在。

0 投票
1 回答
2714 浏览

c# - OData 连接服务与 OData V4 客户端代码生成器

我知道这些扩展是用来生成基于 Odata 服务的客户端代码的。

  1. OData 连接服务与 OData v4 客户端代码生成器扩展之间有什么区别。
  2. 这些扩展的目的是什么?
  3. 何时应使用 OData 连接服务,何时应使用客户端代码生成器?

谁能解释一下利弊?

0 投票
1 回答
4141 浏览

asp.net - 如何处理 Odata V4 客户端中的异常?

Asp.Net Web API Odata 控制器操作:

Odata客户端代码:(Odata v4客户端代码生成器v4)

我想AddProducts()在保存更改的同时在 Method 中以适当的方式处理异常。

如何捕获ModelState从服务器发送的错误return BadRequest(ModelState);

最后,我只想将错误消息显示给从服务器发送的最终用途。示例:“产品类别是必需的。”

上课有什么用ODataException?这会帮助我吗?

请帮我。

0 投票
3 回答
3609 浏览

c# - Web API OData(OData Client v4)键中的正斜杠

我创建了一个 OData Web API,但在查找主键包含正斜杠的数据时遇到问题。

此网址按预期返回数据:
/api/SalesOrders('12345')

但是这个带有正斜杠的键失败:
/api/SalesOrders('12345/1')
即使编码:
/api/SalesOrders('12345%2F1')

在出现的错误中(见下文),看起来最后的正斜杠正在转换为您所期望的反斜杠,因为它是 url 的一部分而不是查询字符串:

在此处输入图像描述

如果我改用以下 url,其中正斜杠位于查询字符串中,则数据将正确返回:
/api/SalesOrders?$filter=SalesOrderNumber eq 12345/1

如果我自己生成网址,这将不是什么大问题。
但是,我使用的是OData v4 客户端代码生成器

所以代码中的调用实际上是这样的:

var salesOrder = erpClient.SalesOrders.ByKey(worksOrder.SalesOrderNumber).GetValue();

这会生成在查询字符串之前包含正斜杠的 url,因此会失败。

  1. 这是 OData v4 客户端的已知问题吗?
  2. 是否有强制使用查询字符串而不是主键类型调用的设置?

我可以通过将正斜杠强制到查询字符串中来解决此问题,如下所示:

var salesOrder = erpClient.SalesOrders.Where(so => so.SalesOrderNumber == "12345/1" && so.SalesOrderNumber == so.SalesOrderNumber).FirstOrDefault();

这会强制在查询字符串中使用正斜杠:
/api/SalesOrders?$filter=SalesOrderNumber eq '450993/1' 和 SalesOrderNumber eq SalesOrderNumber

这感觉很混乱,我想避免离开 OData v4 客户端,因为我们有几个应用程序已经在使用它。

我还能做些什么来使这项工作更整洁吗?

脚注:

我按照这个博客上的过程来处理特殊字符,但这不包括关于如何处理正斜杠的建议:

使用-wcf-data-service-with-restricted-characters-as-keys

0 投票
3 回答
1322 浏览

c# - Asp.Net WebApi OData v4 - 保存实体以及相关实体

考虑关注实体

根据上面的代码,供应商实体可以有零个或多个产品。在上述实体中,ID 由实体框架自动生成。

我正在使用 Odata V4 客户端代码生成器。

客户代码:

供应商控制器:

产品控制器:

当我保存更改时,我收到一条错误消息:

INSERT 语句与 FOREIGN KEY 约束冲突。

错误的原因是Product实体还没有SupplierId数据库生成的密钥。

那么如何在保存记录的同时添加SupplierIdProduct实体中呢?谁能帮我解决这个问题?

0 投票
6 回答
4566 浏览

asp.net - 覆盖 webapi odata 链接的主机

我正在使用 WebAPI 2.2 和 Microsoft.AspNet.OData 5.7.0 创建支持分页的 OData 服务。

当托管在生产环境中时,WebAPI 存在于未暴露在外部的服务器上,因此 OData 响应中返回的各种链接,例如@odata.context@odata.nextLink指向内部 IP 地址http://192.168.X.X/<AccountName>/api/...等。

我已经能够Request.ODataProperties().NextLink通过在每个 ODataController 方法中实现一些逻辑来用外部 URL 替换内部 URL来修改https://account-name.domain.com/api/...,但这非常不方便,它只修复了 NextLinks。

有没有办法在配置 OData 服务时设置外部主机名?我看到了一个属性Request.ODataProperties().Path,想知道是否可以在config.MapODataServiceRoute("odata", "odata", GetModel());调用时设置基本路径,或者在GetModel()实现中使用例如ODataConventionModelBuilder


更新:到目前为止,我想出的最佳解决方案是创建一个BaseODataController覆盖该Initialize方法并检查是否Request.RequestUri.Host.StartsWith("beginning-of-known-internal-IP-address")然后像这样进行 RequestUri 重写:

这完美地修复了@odata.nextLink所有控制器的 URL,但由于某种原因,@odata.contextURL 仍然得到AccountName部分(例如https://account-name.domain.com/AccountName/api/odata/$metadata#ControllerName)所以它们仍然没有工作。

0 投票
3 回答
2011 浏览

asp.net - 当站点具有全局 AuthorizeAttribute 时,ASP.NET 允许匿名访问 OData $metadata

我有一个 ASP.NET OData 站点,它在 WebApiConfig 文件中有以下内容:

这会强制所有调用者在调用任何控制器之前进行身份验证。
不幸的是,这也强制用户身份验证访问“$metadata”网址。
我需要对所有控制器访问进行全局强制身份验证,同时还允许匿名访问“$metadata”url。

0 投票
1 回答
673 浏览

java - 如何在 Apache Olingo V4 Java API 中使用字符串枚举

我只是不知道在数据创建过程中如何使用CsdlEnumTypeApaches Olingo V4 Java API。

到目前为止,这是我用尽可能少的代码所做的事情:

1)在我的EdmODataProvider.java班级中,我创建了一个实体类型并将FQDN枚举实体添加到属性中。此外,我CsdlEnumType在模式提供程序类中实例化了 。我想这是可行的,因为如果我在setValue()部分中只使用数字,我会得到预期的结果。:

2)在我的数据提供者类中,我正在创建一个这样的实体:

如果我试图调用实体,我最终会收到错误:

我的$metadata包含:

我想问题出在第 2 部分)中,我将属性添加DISPNAME为字符串。知道如何解决这个问题吗?