我正在测试Uri.EscapeDataString()方法,并期望http://msdn.microsoft.com/en-us/library/hh367887(v=vs.110).aspx中所述的新行为。但是,当我在一个简单的Azure辅助角色(针对.NET 4.5.1并部署到Windows 2012 R2)中运行此方法时。它没有返回正确的转义字符串。这是我在WorkerRole.Run方法中的简单程序:
public override void Run()
{
while (true)
{
var s = Uri.EscapeDataString("data (test)");
// This returns "data%20(test)" (.NET 4.0 behavior)
// However it should return "data%20%28test%29" (.NET 4.5 behavior)
Thread.Sleep(10000);
Trace.TraceInformation("Working" + s, "Information");
}
}
如果我将EspcapeDataString作为控制台exe运行,那么它会正确地转义字符。为什么在工作主机进程中它的行为有所不同,即使程序集的目标是.net 4.5.1?如何让它正常工作?
答案 0 :(得分:1)
我查看了Uri类代码。我认为问题是Uri.EscapeDataString使用标志ShouldUseLegacyV2Quirks来确定uri转义是否应该遵循RFC 2396或3986.看来这个标志是由条目程序集的目标框架版本决定的。但是在Azure Wroker主机中,它无法确定框架版本,因为它是本机exe,因此即使执行程序集的目标是4.5,它也会回退到旧行为。