我创建了一个OData Web API,但是我在查找主键包含正斜杠的数据时遇到了问题。
此网址按预期返回数据:
的 / API / SalesOrders表( '12345')
但是这个在密钥中使用正斜杠的那个失败了:
的 / API / SalesOrders表( '1分之12345')
即使编码:
的 / API / SalesOrders表( '12345%2F1')
在出现的错误中(见下文),看起来正如您所期望的那样将最终正斜杠转换为反斜杠,因为它是url的一部分而不是查询字符串中的一部分:
如果我改为使用以下url,正斜杠在查询字符串中,则正确返回数据:
/ api / SalesOrders?$ filter = SalesOrderNumber eq 12345/1
如果我自己生成网址,这不会是一个大问题 但是,我使用的是OData v4 Client Code Generator
所以代码中的调用实际上是这样的:
var salesOrder = erpClient.SalesOrders.ByKey(worksOrder.SalesOrderNumber).GetValue();
这将生成在查询字符串之前包含正斜杠的url,从而失败。
我可以通过强制正斜杠进入查询字符串来解决这个问题,如下所示:
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客户端,因为我们有几个已经使用它的应用程序。
还有什么我可以做的让这项工作更整洁吗?
脚注:
我按照此博客上的流程处理特殊字符,但这不包括如何处理正斜杠的建议:
答案 0 :(得分:2)
看看Github上的ODataPathAndSlashEscapeSample。基本思想是子类DefaultODataPathHandler并覆盖Parse
方法。然后在Web API配置代码中为MapODataServiceRoute方法提供自定义路径处理程序的实例。
答案 1 :(得分:1)
这可能是help任何寻找类似解决方案的人,就在“OData路由”部分下...
...为防止出现此错误,您的客户端应使用斜杠(%252F)和反斜杠(%255C)的双转义序列....
答案 2 :(得分:0)
可能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
希望这个帮助