uri.EscapedatAtstring在Nunit测试与ASP.NET WebService中的行为不同



我正在使用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表现出了我的预期。