具有多个键=值项的 URI 的 C# DataContract 反序列化
C# DataContract Deserialization of URIs with multiple key=value terms
我正在使用 SoapUI 将 URI 发送到 C# WCF Web 服务(不是 REST),该服务使用默认的反序列化程序来处理带有 DataContract ([DataContract (NameSpace ="mynamespace")) 注释的 DTO。
URI 的查询组件中可能包含多个键=值项:
示例:lookfor://3904?foo=this & that&bar=6
如果我 urlencode "this & that",但不对 2 之间的 & 进行编码
条款,那么由于未编码的符号分隔符,我将从服务器收到反序列化错误。
如果我对整个 URI 进行 urlencode,那么两个 & 符号都将被编码为 %26。 Web 服务将无法分辨哪些和符号是键=值项的分隔符,哪些是值的一部分,代码将失败。
我可以要求使用和号分隔键值对,编码为 &
,而其余字符接收标准 URL 编码 lookfor://3904?foo%3Dthis%20%26%20that&bar%3D6
. &
将被反序列化为&符号。然后我可以延迟 urldecoding,直到使用 & 作为分隔符细分 URI 的查询部分(以获取我的键=值项)。
这是处理这个问题的标准、专业的方法吗?我用谷歌搜索了又搜索,但找不到处理具有多个键=值项的 URI 的示例。
另一种方法是对值中的“&”符号进行双重编码,并对作为分隔符的“&”符号进行单一编码,但我确实看到(在谷歌搜索时)永远不要双重编码的警告。
让我们分解一下。
您的值是 foo = this&that
和 bar = 6
。
您需要做的第一件事是 URL 对值进行编码,因此您会得到 foo = this%26that
和 bar = 6
。
然后将这些值设置为查询字符串参数,如
lookfor://3904?foo=this%26that&bar=6
。
现在我们需要 XML 对整个 URL 进行编码,结果是
lookfor://3904?foo=this%26that&bar=6
我正在使用 SoapUI 将 URI 发送到 C# WCF Web 服务(不是 REST),该服务使用默认的反序列化程序来处理带有 DataContract ([DataContract (NameSpace ="mynamespace")) 注释的 DTO。
URI 的查询组件中可能包含多个键=值项:
示例:lookfor://3904?foo=this & that&bar=6
如果我 urlencode "this & that",但不对 2 之间的 & 进行编码 条款,那么由于未编码的符号分隔符,我将从服务器收到反序列化错误。
如果我对整个 URI 进行 urlencode,那么两个 & 符号都将被编码为 %26。 Web 服务将无法分辨哪些和符号是键=值项的分隔符,哪些是值的一部分,代码将失败。
我可以要求使用和号分隔键值对,编码为
&
,而其余字符接收标准 URL 编码lookfor://3904?foo%3Dthis%20%26%20that&bar%3D6
.&
将被反序列化为&符号。然后我可以延迟 urldecoding,直到使用 & 作为分隔符细分 URI 的查询部分(以获取我的键=值项)。
这是处理这个问题的标准、专业的方法吗?我用谷歌搜索了又搜索,但找不到处理具有多个键=值项的 URI 的示例。
另一种方法是对值中的“&”符号进行双重编码,并对作为分隔符的“&”符号进行单一编码,但我确实看到(在谷歌搜索时)永远不要双重编码的警告。
让我们分解一下。
您的值是 foo = this&that
和 bar = 6
。
您需要做的第一件事是 URL 对值进行编码,因此您会得到 foo = this%26that
和 bar = 6
。
然后将这些值设置为查询字符串参数,如
lookfor://3904?foo=this%26that&bar=6
。
现在我们需要 XML 对整个 URL 进行编码,结果是
lookfor://3904?foo=this%26that&bar=6