3

我在类库项目中有以下代码(Url 已被简化,但仍演示相同的行为):

Uri oUri = new Uri("https://xzyserver.com/MyFolder%2FMyPage?querystring");

我发现 System.Uri 类在本地与在 Azure Worker Role 中以不同的方式对我的 Urls 进行转义。

如果类库在桌面应用程序中运行 oUri.AbsoluteUri 返回与在 Azure 中运行的不同的值(在计算模拟器和生产工作者角色中):

本地 = MyFolder%2FMyPage?querystring

InAzure = MyFolder/MyPage?querystring

(我不得不删除上面两行中 URL 的开头,因为 Stack Overflow 告诉我帖子中有太多链接)

本地行为是我需要的(作为第三方身份验证过程的一部分,安全令牌是根据请求 Uri 和请求正文的其他部分计算的,这种转义会破坏该过程)。Uri 与 System.Net.Http 命名空间中的类一起使用。

我已经尝试过 Uri 构造函数(sUri,bDontEscape)的过时形式,但这没有任何区别。

此外,行为似乎不一致 - 我还尝试了以下方法:

Uri oUri = new Uri("https://xzyserver.com/MyFolder%252FMyPage?querystring");

但是,转义似乎只适用于 %2F 到“/”,%25 没有转义回“%”,而是 oUri.AbsoluteUri 返回完整的原始 URL,没有转义。

这是一个已知/记录的问题吗?我可能错过了任何简单的解决方法?

PS。System.Net.Http 命名空间中的类在其许多构造函数中采用 Uri 对象或字符串 Uri,但同样的问题适用于两者。我希望这些类只是为基于字符串的重载创建一个 Uri。

4

1 回答 1

1

经过进一步研究,我发现这种行为是设计使然,但可以从 .net 4.0 及更高版本的 app.config 文件进行粗略控制。

http://msdn.microsoft.com/en-us/library/ee656542(v=vs.110).aspx

文档建议默认行为应为 Azure。我找不到为我的本地系统配置的覆盖(也许客户端桌面安装的默认设置是启用覆盖?)。不管真的,至少我理解现在的行为。

将覆盖添加到 Azure 辅助角色 app.config 文件已解决了该问题。

于 2013-11-05T12:14:22.147 回答