Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FxCop告诉我使用.NETURI类是错误的吗?_.net_Url_Amazon S3_Uri_Fxcop - Fatal编程技术网

FxCop告诉我使用.NETURI类是错误的吗?

FxCop告诉我使用.NETURI类是错误的吗?,.net,url,amazon-s3,uri,fxcop,.net,Url,Amazon S3,Uri,Fxcop,当获取Amazon S3 bucket中某个内容的URL时,它可以在末尾附加一个签名,以确认用户具有查看该对象的权限,并且该URL如下所示: Expires=1235241261&签名=t5vFBWXaN0DvVaWfck9n2%2fmTzOU%3d 这些URL是作为字符串对象从我的S3库返回的,我就这样传递它们。最近我通过FxCop运行了我的代码,它建议我使用Uri类来传递URL。我接受了FxCops的建议,将我的URLstringproperties更改为Uriproperties。一切似

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

Expires=1235241261&签名=t5vFBWXaN0DvVaWfck9n2%2fmTzOU%3d

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

出现问题的原因是
Uri
class
ToString()
函数返回的URL版本略有不同:

Expires=1235241261&签名=t5vFBWXaN0DvVaWfck9n2/mTzOU=

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

  • 我应该接受FxCops的建议并使用
    Uri
    类吗
  • 亚马逊是否应该意识到URL可能会经过很多人,而不是依赖于他们完全一样地返回

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

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

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

下面是一篇维基百科文章,详细描述了URL编码

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


当然,Uri不是完美的。瑞克·斯特拉尔最近在他的博客上谈到了这一点。

我同意他的说法。警察没有错。但是FxCop没有告诉您使用System.Uri时可能会遇到的痛苦,特别是在使用ASP.NET时。我刚刚写了一篇文章,这篇文章将帮助您更好地准备使用这个类,这可能有点让人困惑:


嗯。。。一个否决票和一个即将结束的投票,我将非常感谢大家对我如何改进这个问题的评论。在这种情况下,是亚马逊生成了URL,他们是否应该为稍微不同的编码做准备?我认为亚马逊做了正确的事,在他们的查询字符串中将正斜杠编码为“%2f”。如果他们能想出一个URI设计,完全避免转义序列的需要,那就太好了,但有时这是不可能的。好的,你的意思是我应该在使用URI之前对其进行URL编码吗?是的。在浏览器地址栏或HTML中使用它之前,应正确编码字符串。我认为您应该使用Uri.EscapeUriString()方法来完成这项工作,但首先要检查文档。