3

在获取 Amazon S3 存储桶中某物的 URL 时,它可以在末尾附加一个签名以确认用户有权查看该对象,并且该 URL 如下所示:

https://mybucket.amazonaws.com/mykey?AWSAccessKeyId=myaccesskey& Expires=1235241261&Signature= t5vFBWXaN0DvVaWfck9n2%2fmTzOU%3d

这些 URL 作为字符串对象从我的 S3 库中返回,我就这样传递它们。最近我通过 FxCop 运行我的代码,它建议我使用Uri该类来传递 URL。我接受了 FxCops 的建议并将我的 URLstring属性更改为Uri属性。一切似乎都运行良好,直到很久以后我才注意到并非所有对象都被成功取回。

问题的原因是UriToString()函数会返回一个稍微不同版本的 URL:

https://mybucket.amazonaws.com/mykey?AWSAccessKeyId=myaccesskey& Expires=1235241261&Signature= t5vFBWXaN0DvVaWfck9n2/mTzOU=

我的解决方案是使用类的OriginalString属性Uri。但是对此感觉有些不对劲,我有两个问题,

  • 我应该接受 FxCops 的建议并使用Uri课程吗?
  • 亚马逊是否应该意识到 URL 可能会经过许多人的手,而不是依赖于它们以完全相同的方式返回?

对于使用 .Net Uri 类,我可以确定我的 URL 始终有效,但它似乎会导致更微妙的错误。

4

2 回答 2

4

FxCop 建议使用 Uri 类而不是原始字符串并没有错。使用 Uri 类提供了类型安全性和几个有用的解析方法。

System.Uri 会自动对查询字符串进行一些编码和解码。听起来您并没有预料到这种行为,并且它引起了一些问题。我建议根据 HTTP 标准检查 URI 中应该转义的字符。

这是一篇维基百科文章,更详细地描述了百分比编码或 URL 编码。

您的具体问题是%2f正斜杠/字符的 URL 中的转义序列。System.Uri 类为您解码了该序列。

当然,System.Uri 并不完美。Rick Strahl 最近在他的博客上谈到了 Uri 字符串编码的不同选项。

于 2009-02-21T18:59:12.510 回答
4

我同意 dthrasher。FxCop 没有错。但是 FxCop 没有告诉您的是使用 System.Uri 时可能会遇到的痛苦,尤其是使用 ASP.NET 时。我刚刚写了一篇文章,可以帮助您更好地准备使用这个类,这可能有点令人困惑:

http://web.archive.org/web/20091015051451/http://www.pluralsight.com/community/blogs/keith/archive/2009/10/10/did-fxcop-tell-you-to-use-系统 uri.aspx

于 2009-10-10T18:39:44.297 回答