Web API OData(OData Client v4)在密钥中转发斜杠

时间:2016-02-04 10:38:57

标签: c# asp.net asp.net-web-api odata odata-v4

我创建了一个OData Web API,但是我在查找主键包含正斜杠的数据时遇到了问题。

此网址按预期返回数据:
/ API / SalesOrders表( '12345')

但是这个在密钥中使用正斜杠的那个失败了:
/ API / SalesOrders表( '1分之12345')
即使编码:
/ API / SalesOrders表( '12345%2F1')

在出现的错误中(见下文),看起来正如您所期望的那样将最终正斜杠转换为反斜杠,因为它是url的一部分而不是查询字符串中的一部分:

enter image description here

如果我改为使用以下url,正斜杠在查询字符串中,则正确返回数据:
/ api / SalesOrders?$ filter = SalesOrderNumber eq 12345/1

如果我自己生成网址,这不会是一个大问题 但是,我使用的是OData v4 Client Code Generator

所以代码中的调用实际上是这样的:

var salesOrder = erpClient.SalesOrders.ByKey(worksOrder.SalesOrderNumber).GetValue();

这将生成在查询字符串之前包含正斜杠的url,从而失败。

  1. 这是OData v4客户端的已知问题吗?
  2. 是否存在强制在主键类型调用上使用查询字符串的设置?
  3. 我可以通过强制正斜杠进入查询字符串来解决这个问题,如下所示:

    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客户端,因为我们有几个已经使用它的应用程序。

    还有什么我可以做的让这项工作更整洁吗?

    脚注:

    我按照此博客上的流程处理特殊字符,但这不包括如何处理正斜杠的建议:

    using-wcf-data-service-with-restricted-characters-as-keys

3 个答案:

答案 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

希望这个帮助