Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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
C# 为什么默认情况下会设置请求[“url”]?_C#_Asp.net - Fatal编程技术网

C# 为什么默认情况下会设置请求[“url”]?

C# 为什么默认情况下会设置请求[“url”]?,c#,asp.net,C#,Asp.net,即使我没有发布或获取任何名为url的参数,它仍然会被插入到请求变量中,从而导致始终设置请求[“url”]。默认值是请求的aspx文件。如果在请求中包含url作为POST或GET参数,则默认值将被覆盖。你能解释一下为什么在.net中实现这种行为吗?为什么不能?这是Eric Lippart对几乎所有“为什么C#不实现X”的答案的推论(参见) 原因是“因为有人写的”。如果没有写在这里的框架设计师来解释原因,我们可能永远也不会知道。但是,答案很可能是因为“这是一条有用的捷径”,很可能可以追溯到.net

即使我没有发布或获取任何名为url的参数,它仍然会被插入到请求变量中,从而导致始终设置
请求[“url”]
。默认值是请求的aspx文件。如果在请求中包含url作为POST或GET参数,则默认值将被覆盖。你能解释一下为什么在.net中实现这种行为吗?

为什么不能?这是Eric Lippart对几乎所有“为什么C#不实现X”的答案的推论(参见)


原因是“因为有人写的”。如果没有写在这里的框架设计师来解释原因,我们可能永远也不会知道。但是,答案很可能是因为“这是一条有用的捷径”,很可能可以追溯到.net asp之前的经典时代。

这在HttpRequest类信息中有记录。查看Items集合,它特别指出它将查看来自QueryString、Form、Cookie或ServerVariables的对象。这确实可以追溯到经典的ASP和其他实现了类似功能的语言,比如PHP,尽管PHP认为它不安全,我相信它在V5.5中被关闭了。微软也建议不要这样做,因为它可能被利用。在请求[“url”]的情况下,它将返回一个服务器变量。如果查询字符串中存在变量url,则请求[“url”]将返回该查询字符串变量,因为它在列表中首先被扫描。它是为了向后兼容经典ASP而引入的,因为它在经典ASP中被广泛使用


当您使用HttpRequest对象的语法类似于请求[“url”]时,实际上是在按键搜索多个内部集合。HttpRequest上的索引器声明为:

public string this[string key]{ get; }
索引器是一种语法糖,能够以数组的形式访问/搜索任何对象,事实上,它们通常用于某种类型的集合类中

HttpRequest类不是数组或集合,而是更复杂的类型,它包含一组不同的成员,包括几个集合(cookie、ServerVariables、QueryString、Form等)。索引器只是一个抽象,使请求对象像单个集合一样可访问

为了演示它是如何工作的,下面是一个非常接近实际.NET 4.5实现的索引器定义:

public string this[string key]
{
    get
    {
        string val = this.QueryString[key];

        if (val != null)
            return val;

        val = this.Form[key];

        if (val != null)
            return str;

        var cookie = this.Cookies[key];

        if (cookie != null)
            return cookie.Value;

        val = this.ServerVariables[key];

        if (val != null)
            return val;

        return null;
    }
}
现在我终于可以回答你真正的问题了

如果在请求中包含url作为POST或GET参数,则默认值将被覆盖。你能解释一下为什么在.net中实现这种行为吗

当您通过POST或GET发送“url”参数时,您只是在向索引器访问的表单或查询字符串集合添加一个值,我看不出有什么问题。所有内部HttpRequest集合(Cookies、querystring等)都可以在代码的任何部分进行修改

默认请求[“url”]值来自哪里

ServerVariables集合

发布或获取url参数是否有危险


如果您在C#中使用请求[“url”],并且不知道它是如何工作的,则可以。绝对不应该使用它来访问当前路径。您应该改用Request.Path属性。

我不知道我是否同意“为什么不?”一概而论。如果您发现每次实例化
字典时,
dict[“teehee”]
都会导致
5
,除非被重写,我肯定会在某个地方记录这一点。对于任何意外的实施行为,都应该有一个记录在案的原因。尽管如此,埃里克·利珀特的回答对我来说是有意义的。可能应该是评论,而不是回答(可能投票结束)。。。同样在本例中,它清楚地记录了(见我的答案),所以预期的行为。@itsme86-事实上,它记录为Alexei的答案笔记,但这不是你要问的。。你在问为什么它会在那里。而为什么的答案只有那些创造它的人知道,因为他们没有记录为什么。这只是获取服务器变量的快捷方式,其他服务器变量也可以通过这种方式检索。@AlexeiLevenkov-实际上,你的变量应该是注释,因为你实际上没有回答问题。。是的。我在帖子中添加了关于问题类型的评论。考虑重新排序你的帖子,所以实际的猜测/答案是在顶部,所以它可以是最好的猜测迄今为止(也可能是唯一的)。问题的历史原因通常是不合理的回答。有关可能的原因,请参阅Erik Funkenbusch的帖子。为了使您的问题更实用、更适合您,您可以评论为什么需要这些信息(例如,“我正在实现新的framewrok/wrapper类,如果我仍然支持……,我会感兴趣”)。请注意,提问是可以的,但大多数此类问题的实际答案是不可能的(尤其是15年前做出的决定)。