【问题标题】:OData WebAPI Key fails due to invalid charactersOData WebAPI 密钥因无效字符而失败
【发布时间】:2014-07-02 00:51:42
【问题描述】:

我已阅读并成功实施了支持 OData 中的复合键的解决方案,如 http://code.msdn.microsoft.com/Support-Composite-Key-in-d1d53161
但是这个问题与此无关,因为 CompositeKeyRoutingConvention 类甚至没有被命中。

我的问题是,如果模型中的主键字段之一是 datetimeoffset(受支持的原始类型),则客户端生成的 Uri 无法识别并在路由之前失败。

例如:

GET http://myserver.com:12345/odata/HospitalPens(Pen='C7',StartDate=datetimeoffset'2001-06-30T00:00:00%2B10:00')

这就是客户端使用 WCF DataService 调用使用主键字段创建和执行上述请求的方式。

var start = new DateTimeOffset(2001, 6, 30, 0, 0, 0, new TimeSpan(+10, 0, 0));
var gal = container.HospitalPens.Where(c => c.Pen == "C7" && c.StartDate == start).FirstOrDefault();

模型在 WebApiConfig 的 Register 方法中正确定义了复合键

var hospitalPens = builder.EntitySet("HospitalPens"); hospitalPens.EntityType.HasKey(e => new { e.Pen, e.StartDate });

如果我尝试在开始日期进行过滤,我会得到我期望的结果,并且一切都很好。示例调用如下所示

GET http://myserver.com:12345/odata/HospitalPens?$filter=StartDate%20eq%20datetimeoffset'2001-06-30T00:00:00'

无法更改数据库密钥,因此我需要解决此问题。提前致谢。

编辑: 在我看来,这是 OData 客户端构建 URL 的方式的问题。如果密钥有任何可能包含无效字符,这将由于 url 验证实践而失败。例如,包含 ? 的字符串键(非常常见),即使是 % 和 & 符号也会导致此操作失败。主要问题是字符将出现在 URL 的查询字符串部分之前,因此会导致问题。
但是有没有一种方法可以确保这些生成的 URL 在发送到浏览器之前是有效的?这使得 odata 查询结构在我看来作为 odata('key') 存在缺陷? url 构造不会通过许多请求过滤器。

【问题讨论】:

    标签: wcf asp.net-web-api client odata wcf-data-services


    【解决方案1】:

    尝试删除url中的datetimeoffset前缀和单引号,:

    GET http://myserver.com:12345/odata/HospitalPens(Pen='C7',StartDate=2001-06-30T00:00:00%2B10:00)。

    或者,尝试转义 url 中的 ':':

    GET http://myserver.com:12345/odata/HospitalPens(Pen='C7',StartDate=2001-06-30T00%3A00%3A00%2B10%3A00)。

    只需将其粘贴到浏览器的地址栏即可。如果上述任何一项工作,请使用此代码:

    var gal = container.Execute("HospitalPens(Pen='c7',StartDate=xxx)");
    

    【讨论】:

    • 我想知道你是否使用的是OData Client V4,如果没有,请关注这篇博文:blogs.msdn.com/b/odatateam/archive/2014/03/11/…>
    • 谢谢,但我没有创建 URL,所以不知道如何按照建议进行调整。客户端对 container.HospitalPens.Where 的调用会在后台生成该 Url。我想知道是否有一点我可以在生成 url 之前拦截?您的建议是解决潜在问题的方法,虽然它可能有效,但不是“正确”的答案,因为任何时候日期都包含在密钥中并在 where 子句中使用时,都会出现此问题!我现在也有幸使用最新版本的 DLL (Microsoft.Data.Odata 5.6.1)
    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2020-05-21
    • 2020-05-27
    相关资源
    最近更新 更多