我正在使用uri.codedatastring在URL上发送查询字符串。原始字符串是:Photo($select=Name,Id)
在我在VS2015调试器中运行的ASP.NET Web服务中,URI.CODEDATATASTRING将返回:Photo(%24select%3DName%2CId)
但是,在VS2015中的Resharper测试跑步者下运行的Nunit测试中,它返回:Photo%28%24select%3DName%2CId%29
。注意括号的编码的差异。
为什么括号在单元测试中编码而不是在Web服务中进行编码?括号不应该在Web服务中编码吗?我在.NET 4.6下运行,因此我不应该受到stackoverflow上其他地方讨论的RFC 3986问题的影响(这里,这里,这里和网络周围的其他地方)。
最后,我确实受到RFC 3986问题的影响。
事实证明,差异是.net 4.5的"怪癖"模式。在ASP.NET应用程序中运行时,除非明确设置,否则.NET将尝试维持与以前版本的应用程序兼容性。
我进入了框架代码,并在Uriparser中找到了一个怪异设置。谷歌搜索带领我进入了有关web.config中<httpruntime>
元素的这篇文章。它在末尾说:
"如果没有
<httpRuntime targetFramework>
属性 web.config,我们假设应用程序想要4.0怪癖 行为。"
一旦我将 targetFramework="4.5"
添加到我的web.config,uri.escapedatastring表现出了我的预期。