从System.Web.HttpRequest获取带方括号表示法的“RawUrl”

时间:2014-01-20 03:22:28

标签: c# .net

我遇到了一个问题,每当我在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只是一个字符串,所以我想它会更容易获得。我不理解的是什么?

3 个答案:

答案 0 :(得分:1)

HttpRequest索引器(如何使用方括号访问)按顺序访问以下定位的字符串。

  1. QueryString
  2. FormCollection
  3. Cookies
  4. ServerVariables
  5. 我已复制粘贴此帖子底部的HttpRequest索引器的代码(已反编译)。

    现在回答你的问题。 RawUrl不属于任何这些项目,而是来自完全不同的位置。如果有效,则使用两部分构建RawUrl

    1. QueryString文本
    2. 网址字符串(未经验证)
    3. 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.QueryString
  • Request.Cookies时
  • 的Request.Form
  • Request.ServerVariables

您可以使用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#中等效的可能错误信息)