【发布时间】: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