问题标签 [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 投票
1 回答
380 浏览

c# - WebApi OData 每个用户的财产安全

我有一些实体的数据只能供某些用户访问。

例如Bar.Secret,只能由 访问,UserA但不能由访问UserB。我可以这样:

除此之外,这是一个糟糕的实现。它不包括这个控制器:

可以调用哪个/odata/Foos?$expand=Bars,然后我可以查看Bar.Secret. 我不能只是禁用$expandFoo因为该查询是完全合法的UserA,也是需要的。

有没有办法让 OData 针对某些涉及所请求实体的谓词验证查询。

就像是

0 投票
0 回答
241 浏览

c# - 抽象的通用 ODataController 导致“未找到 HTTP 资源”

我有这个基础 ODataController

而这个派生的控制器

我可以打得.../odata/foos(1)很好。但是.../odata/foos给出这个错误:

我必须创建Get()虚拟,然后在派生控制器中覆盖它。像这样:

为什么Get()在基本控制器中不起作用,什么时候起作用Get(1)

0 投票
1 回答
227 浏览

entity-framework - 如何在实体类中有两个自引用

我有一个Foo可以有两个对自身的可选引用:ParentIdRootId.

有一个工作正常,但是当我介绍第二个自我引用时,我得到了错误:

无法确定类型“Model.Foo”和“Model.Foo”之间关联的主体端。此关联的主体端必须使用关系流式 API 或数据注释显式配置。

0 投票
1 回答
674 浏览

unit-testing - 使用 XUnit 和 MOQ 进行单元测试 OData V4 PUT 操作

我的目标是在 OData v4 控制器中对 PUT 操作进行单元测试。

我正在为 Entity Framework 6 Context 和 NBuilder 使用 MOQ 来构建测试数据。

我能够成功测试 Get 和 Get(Id),但是当我从 PUT 操作中检索 HTTPActionResult 时无法运行断言。

我可以看到 HTTPActionResult 在调试模式下返回带有 Entity 属性的 UpdatedODataResult 对象,但我看不到在设计时使用它的方法。

有谁知道如何从 Async PUT 操作响应中提取返回的实体?

这是代码:

这是我的单元测试代码

0 投票
1 回答
606 浏览

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

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

假设我有这个实体:

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

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

示例 json 结果:

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

0 投票
1 回答
1260 浏览

c# - oData 过滤器不适用于 MongoDB 和 Web API 的导航属性

控制器看起来像

在 MongoDb 存储库中,我返回集合的 AsQueryable。

MongoDB 文档看起来像

Id 是使用 ObjectId.GenerateNewId().ToString() 生成的,因此它们存储为字符串。

Node 和 NodeGroup 是纯 POCO

问题

oData URI,例如

工作正常。

但是当我尝试过滤导航属性时

它给了我例外

message: "无法确定表达式的序列化信息:ConditionalExpression。",

0 投票
1 回答
829 浏览

json - $select 返回导航属性的空 json 结果

我在 web api 中使用 v4 的 oData。

我的 get all 调用正确地返回了整个集合(总共 3 个对象)。

在此处输入图像描述

但试图只选择 StoreCommand 给了我 3 个空白对象

试图扩展 StoreCommand 给了我 StoreCommand 但没有给我它的导航属性

我只想要主对象的 StoreCommand 属性及其所有导航属性。

0 投票
2 回答
1139 浏览

c# - 没有元数据操作的 Odata 不起作用

我在这里尝试了本文中描述的解决方案: 原始文章

如前所述,我做了:

一切正常,没有更多的元数据信息。标准请求工作正常,但未绑定的操作和功能不再工作,我收到 404 响应。

我将操作注册到 Odata 模型构建器,例如:

在控制器中我有:

有什么建议我可以如何实现隐藏 Odatametada 但仍然有操作/功能工作?

0 投票
2 回答
1368 浏览

asp.net - 如何防止在 ASP.NET Web API OData 服务中发布不足?

我创建了一个非常简单的 OData v4 控制器。控制器基本上包含以下实体的实体框架支持的 CRUD 方法Pet

这里重要的Pet.Age是不可为空的必需属性。

这是控制器本身(仅Post显示方法):

这是我的WebApiConfig控制器配置:

现在,如果我想Pet在我的数据库中创建一个新的,我会发出这样的POST请求:

但是,我可以简单地省略AgeJSON 请求负载中的属性,因此 JSON 反序列化器将使用默认值0,而我希望400 Bad Request返回一个状态。这个问题被称为发布不足。

使用常规 WebApi 控制器时可以轻松解决(解决方案在此处描述)。您只需创建 aPetViewModel并使您的控制器接受 aPetViewModel而不是实际Pet实体:

然后在您的控制器中,您只需转换PetViewModelPet实体并像往常一样将其保存到数据库中。

不幸的是,这种方法不适用于 OData 控制器:如果我将Post方法更改为 acceptPetViewModel而不是Pet,我会收到以下错误:

System.Net.Http.UnsupportedMediaTypeException:没有 MediaTypeFormatter 可用于从媒体类型为“application/json”的内容中读取“PetViewModel”类型的对象。

在 System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent 内容,类型类型,IEnumerable'1 格式化程序,IFormatterLogger 格式化程序记录器,CancellationToken 取消令牌)

在 System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent 内容,Type 类型,IEnumerable'1 格式化程序,IFormatterLogger formatterLogger,CancellationToken cancelToken)

在 System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage 请求,类型类型,IEnumerable`1 格式化程序,IFormatterLogger 格式化程序记录器,CancellationToken 取消令牌)

那么,在使用 OData 控制器时,有什么方法可以防止发布不足?

0 投票
0 回答
308 浏览

asp.net-mvc-4 - IPrincipal 应该是 ClaimsPrincipal 但是 WindowsPrincipal

我有一个控制器,上面有 3 个操作方法,其中两个是常规 OData 调用,第三个是函数。使用 Azure AD 和 ADAL 保护 WebAPI。

CustomAuthAttribute(IsAppAuthorizing 只需检查 web.config 条目)

启动.Auth.cs

控制器(ByUser 是 OData 函数,没有得到正确的 IPrincple 信息,其他两种方法工作正常)