【问题标题】:Web API OData (OData Client v4) forward slash in keyWeb API OData(OData Client v4)键中的正斜杠
【发布时间】:2016-05-13 22:21:54
【问题描述】:

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

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

但是这个键中带有正斜杠的失败:
/api/SalesOrders('12345/1')
即使已编码:
/api/SalesOrders('12345%2F1')

在出现的错误中(见下文),看起来最后的正斜杠正在转换为您所期望的反斜杠,因为它是 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. 是否有强制使用查询字符串而不是主键类型调用的设置?

我可以通过在查询字符串中强制使用正斜杠来解决这个问题,如下所示:

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

【问题讨论】:

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


    【解决方案1】:

    看看 Github 上的 ODataPathAndSlashEscapeSample。基本思想是继承DefaultODataPathHandler 并覆盖Parse 方法。然后在 Web API 配置代码中为 MapODataServiceRoute 方法提供自定义路径处理程序的实例。

    【讨论】:

    【解决方案2】:

    这可能是 help 任何正在寻找类似解决方案的人,就在“OData Routing”部分下...

    ...为防止此错误,您的客户端应使用双转义序列作为斜杠 (%252F) 和反斜杠 (%255C)....

    【讨论】:

      【解决方案3】:

      可能是 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

      希望有帮助

      【讨论】:

      • 向函数或操作提交 POST 请求肯定会避免该问题,因为数据将在请求正文中。如果我可以在服务器端做一些事情那就太好了,这样我就不必为我的所有实体单独创建 GetByKey[POST] 操作。我会调查一下。
      猜你喜欢
      • 2015-02-16
      • 2014-11-27
      • 2014-10-02
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多