Web API OData (OData Client v4) 密钥中的正斜杠
Web API OData (OData Client v4) forward slash in key
我创建了一个 OData Web API,但我在查找主键包含正斜杠的数据时遇到问题。
这个 url returns 数据符合预期:
/api/SalesOrders('12345')
但是这个在键中带有正斜杠的失败了:
/api/SalesOrders('12345/1')
即使编码:
/api/SalesOrders('12345%2F1')
在出现的错误中(见下文),看起来最后的正斜杠正像您预期的那样被转换为反斜杠,因为它是 url 的一部分而不是在查询字符串中:
如果我使用以下 url 代替,在查询字符串中正斜杠的位置,则数据会正确返回:
/api/SalesOrders?$filter=SalesOrderNumber eq 12345/1
如果我自己生成 url,这就不是什么大问题了。
但是,我使用的是 OData v4 Client Code Generator
所以代码中的调用实际上是这样的:
var salesOrder = erpClient.SalesOrders.ByKey(worksOrder.SalesOrderNumber).GetValue();
这会生成 url,其中包含查询字符串前的正斜杠,因此失败。
- 这是 OData v4 客户端的已知问题吗?
- 是否有强制在主键类型调用上使用查询字符串的设置?
我可以通过在查询字符串中强制使用正斜杠来解决这个问题,如下所示:
var salesOrder = erpClient.SalesOrders.Where(so => so.SalesOrderNumber == "12345/1" && so.SalesOrderNumber == so.SalesOrderNumber).FirstOrDefault();
这会强制将正斜杠插入查询字符串:
/api/SalesOrders?$filter=SalesOrderNumber eq '450993/1' and SalesOrderNumber eq SalesOrderNumber
这感觉很乱,我想避免离开 OData v4 客户端,因为我们有几个应用程序已经在使用它。
还有什么我可以做的让这项工作更整洁吗?
脚注:
我按照此博客上的流程处理特殊字符,但这不包括有关如何处理正斜杠的建议:
可能 odata 搞砸了,因为它可以直接读取
即使它被编码,我的意见是你必须在请求内容中将参数作为对象发送。
你可以看得更清楚http://blogs.msdn.com/b/odatateam/archive/2014/12/08/function-amp-action-in-web-api-v2-2-for-odata-v4-0-type-scenario.aspx#gist16957953
希望对您有所帮助
查看 Web API 配置代码中的 ODataPathAndSlashEscapeSample on Github. The basic idea is to subclass DefaultODataPathHandler and override the Parse
method. Then provide an instance of your custom path handler to the MapODataServiceRoute 方法。
这可能 help 正在寻找类似解决方案的任何人,就在 'OData Routing' 部分...
...为防止出现此错误,您的客户端应为斜线 (%252F) 和反斜线 (%255C) 使用双转义序列....
我创建了一个 OData Web API,但我在查找主键包含正斜杠的数据时遇到问题。
这个 url returns 数据符合预期:
/api/SalesOrders('12345')
但是这个在键中带有正斜杠的失败了:
/api/SalesOrders('12345/1')
即使编码:
/api/SalesOrders('12345%2F1')
在出现的错误中(见下文),看起来最后的正斜杠正像您预期的那样被转换为反斜杠,因为它是 url 的一部分而不是在查询字符串中:
如果我使用以下 url 代替,在查询字符串中正斜杠的位置,则数据会正确返回:
/api/SalesOrders?$filter=SalesOrderNumber eq 12345/1
如果我自己生成 url,这就不是什么大问题了。
但是,我使用的是 OData v4 Client Code Generator
所以代码中的调用实际上是这样的:
var salesOrder = erpClient.SalesOrders.ByKey(worksOrder.SalesOrderNumber).GetValue();
这会生成 url,其中包含查询字符串前的正斜杠,因此失败。
- 这是 OData v4 客户端的已知问题吗?
- 是否有强制在主键类型调用上使用查询字符串的设置?
我可以通过在查询字符串中强制使用正斜杠来解决这个问题,如下所示:
var salesOrder = erpClient.SalesOrders.Where(so => so.SalesOrderNumber == "12345/1" && so.SalesOrderNumber == so.SalesOrderNumber).FirstOrDefault();
这会强制将正斜杠插入查询字符串:
/api/SalesOrders?$filter=SalesOrderNumber eq '450993/1' and SalesOrderNumber eq SalesOrderNumber
这感觉很乱,我想避免离开 OData v4 客户端,因为我们有几个应用程序已经在使用它。
还有什么我可以做的让这项工作更整洁吗?
脚注:
我按照此博客上的流程处理特殊字符,但这不包括有关如何处理正斜杠的建议:
可能 odata 搞砸了,因为它可以直接读取 即使它被编码,我的意见是你必须在请求内容中将参数作为对象发送。 你可以看得更清楚http://blogs.msdn.com/b/odatateam/archive/2014/12/08/function-amp-action-in-web-api-v2-2-for-odata-v4-0-type-scenario.aspx#gist16957953
希望对您有所帮助
查看 Web API 配置代码中的 ODataPathAndSlashEscapeSample on Github. The basic idea is to subclass DefaultODataPathHandler and override the Parse
method. Then provide an instance of your custom path handler to the MapODataServiceRoute 方法。
这可能 help 正在寻找类似解决方案的任何人,就在 'OData Routing' 部分...
...为防止出现此错误,您的客户端应为斜线 (%252F) 和反斜线 (%255C) 使用双转义序列....