具有多个键=值项的 URI 的 C# 数据协定反序列化

本文关键字:URI 数据 反序列化 | 更新日期: 2023-09-27 18:32:12

我正在使用 SoapUI 将 URI 发送到 C# WCF Web 服务(不是 REST),该服务使用默认反序列化程序进行 DTO 注释,并使用 DataContract ([DataContract (NameSpace ="mynamespace")] 进行批注。

URI 的查询组件中可能包含多个键=值术语:示例:lookfor://3904?foo=this & that&bar=6

  • 如果我对"这个和那个"进行编码,但不对 2 之间的 & 进行编码术语,然后由于未编码的 & 分隔符,我将从服务器收到反序列化错误。

  • 如果我对整个 URI 进行编码,那么两个与号都将编码为 %26。Web 服务将无法分辨哪些 & 符号是键=值项的分隔符,哪些是值的一部分,代码将失败。

  • 我可以要求使用与号分隔键值对进行编码&而其余字符接收标准 URL 编码lookfor://3904?foo%3Dthis%20%26%20that&bar%3D6&将被反序列化为与号。然后,我可以延迟 url 解码,直到使用 & 作为分隔符细分 URI 的查询部分(以获取我的键=值术语)。

这是处理这个问题的标准、专业方法吗?我用谷歌搜索了一下,找不到处理具有多个键=值术语的 URI 的示例。

另一种方法是对值中的 & 符号进行双重编码,并对作为分隔符的 & 符号进行单独编码,但我确实看到(在谷歌搜索时)警告永远不要双重编码。

具有多个键=值项的 URI 的 C# 数据协定反序列化

让我们分解一下。

您拥有的值是 foo = this&thatbar = 6 .

您需要做的第一件事是对值进行 URL 编码,以便您获得foo = this%26thatbar = 6

然后将这些值设置为查询字符串参数,如

lookfor://3904?foo=this%26that&bar=6 .

现在我们需要对整个 URL 进行 XML 编码,这会导致

lookfor://3904?foo=this%26that&bar=6