我遇到了一个问题,每当我在C#中加载页面时,我都试图获取System.Web.HttpRequest
类实例的成员。具体而言,只要访问RawUrl
成员,就会出现问题。这是一个简单的例子,在.Net 3.5上运行。
string u0 = Request["RawUrl"]; // this gives me a value of null
string u1 = Request.RawUrl; // Using dot notation instead of square brackets works
string u2 = Request["Url"]; // However, "Url" works with square bracket notation
所以我的问题是为什么我可以使用方括号表示法获取请求的Url
属性,但不能对RawUrl
执行相同的操作? Url
属性是System.Uri
属性,而RawUrl
只是一个字符串,所以我想它会更容易获得。我不理解的是什么?
答案 0 :(得分:1)
HttpRequest索引器(如何使用方括号访问)按顺序访问以下定位的字符串。
QueryString
FormCollection
Cookies
ServerVariables
我已复制粘贴此帖子底部的HttpRequest
索引器的代码(已反编译)。
现在回答你的问题。 RawUrl
不属于任何这些项目,而是来自完全不同的位置。如果有效,则使用两部分构建RawUrl
。
RawUrl
构造的代码基于请求类型跨越多个类和对象。如果您需要有关RawUrl
如何构建的更多信息,我建议您抓取反编译器并查看。
希望这有帮助
来自System.Web.dll(v4.5)的HttpRequest索引器代码
public string this[string key]
{
get
{
string item = this.QueryString[key];
if (item != null)
{
return item;
}
item = this.Form[key];
if (item != null)
{
return item;
}
HttpCookie httpCookie = this.Cookies[key];
if (httpCookie != null)
{
return httpCookie.Value;
}
item = this.ServerVariables[key];
if (item != null)
{
return item;
}
return null;
}
}
答案 1 :(得分:1)
它不起作用,因为它们是两个完全不同的东西。有一个不会自动给你另一个。 E.g:
class YourClass {
public string RawUrl { get; set; }
}
..给你YourClass.RawUrl
。鉴于:
class YourClass {
public string this[string key] {
get {
return ...;
}
}
}
..为您提供YourClass["RawUrl"]
。
就ASP.NET中的HttpRequest
对象而言,它根本不提供“RawUrl”作为字符串传递。它在内部的作用是使用提供的字符串来检查以下内容:
您可以使用Request["HTTP_URL"]
(这是一个服务器变量)来大致等同于RawUrl
属性..您可能需要将其与其他内容结合使用太
答案 2 :(得分:0)
与...不同JavaScript中foo["bar"]
和foo.bar
是访问同一成员的方式,在C#中它们意味着完全不同的东西 - 它不仅仅是一个不同的符号,它是一种完全不同的方法。
如果对象有一个对象,则调用the indexer上的方括号(如果对象没有,则导致编译器错误)。在HttpRequest的情况下,方括号调用HttpRequest.Items。
从QueryString,Form,Cookies或ServerVariables集合中获取指定的对象。
public string this[string key] { get; }
URL
是所述项目的一部分,RawUrl不是。 (那当然不回答“为什么不是?”这个问题,我认为其他人有一个很好的答案,但我的意思是解决方括号和点符号在C#中等效的可能错误信息)