.net 三大核心对象

HttpRequest

现在总算轮到第一个核心对象出场了。MSDN给它作了一个简短的解释:“使 ASP.NET 能够读取客户端在 Web 请求期间发送的 HTTP 值。”
这个解释还算是到位的。HttpRequest的实例包含了所有来自客户端的所有数据,我们可以把这些数据看成是输入数据, Handler以及Module就相当于是处理过程,HttpResponse就是输出了。

在HttpRequest包含的所有输入数据中,有我们经常使用的QueryString, Form, Cookie,

它还允许我们访问一些HTTP请求头、 浏览器的相关信息、请求映射的相关文件路径、URL详细信息、请求的方法、请求是否已经过身份验证,是否为SSL等等。

HttpRequest的公开属性绝大部分都是比较重要的,这里就简单地列举一下吧。

  1. // 获取服务器上 ASP.NET 应用程序的虚拟应用程序根路径。
  2. public string ApplicationPath { get; }
  3.  
  4. // 获取应用程序根的虚拟路径,并通过对应用程序根使用波形符 (~) 表示法(例如,以“~/page.aspx”的形式)使该路径成为相对路径。
  5. public string AppRelativeCurrentExecutionFilePath { get; }
  6.  
  7. // 获取或设置有关正在请求的客户端的浏览器功能的信息。
  8. public HttpBrowserCapabilities Browser { get; set; }
  9.  
  10. // 获取客户端发送的 cookie 的集合。
  11. public HttpCookieCollection Cookies { get; }
  12.  
  13. // 获取当前请求的虚拟路径。
  14. public string FilePath { get; }
  15.  
  16. // 获取采用多部分 MIME 格式的由客户端上载的文件的集合。
  17. public HttpFileCollection Files { get; }
  18.  
  19. // 获取或设置在读取当前输入流时要使用的筛选器。
  20. public Stream Filter { get; set; }
  21.  
  22. // 获取窗体变量集合。
  23. public NameValueCollection Form { get; }
  24.  
  25. // 获取 HTTP 头集合。
  26. public NameValueCollection Headers { get; }
  27.  
  28. // 获取客户端使用的 HTTP 数据传输方法(如 GET、POST 或 HEAD)。
  29. public string HttpMethod { get; }
  30.  
  31. // 获取传入的 HTTP 实体主体的内容。
  32. public Stream InputStream { get; }
  33.  
  34. // 获取一个值,该值指示是否验证了请求。
  35. public bool IsAuthenticated { get; }
  36.  
  37. // 获取当前请求的虚拟路径。
  38. public string Path { get; }
  39.  
  40. // 获取 HTTP 查询字符串变量集合。
  41. public NameValueCollection QueryString { get; }
  42.  
  43. // 获取当前请求的原始 URL。
  44. public string RawUrl { get; }
  45.  
  46. // 获取有关当前请求的 URL 的信息。
  47. public Uri Url { get; }
  48.  
  49. // 从 QueryString、Form、Cookies 或 ServerVariables 集合中获取指定的对象。
  50. public string this[string key] { get; }
  51.  
  52. // 将指定的虚拟路径映射到物理路径。
  53. // 参数: virtualPath: 当前请求的虚拟路径(绝对路径或相对路径)。
  54. // 返回结果: 由 virtualPath 指定的服务器物理路径。
  55. public string MapPath(string virtualPath);

  

下面我来说说一些不被人注意的细节。

HttpRequest的QueryString, Form属性的类型都是NameValueCollection,它个集合类型有一个特点:允许在一个键下存储多个字符串值。
以下代码演示了这个特殊的现象:

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. string[] allkeys = Request.QueryString.AllKeys;
  4. if( allkeys.Length == 0 )
  5. Response.Redirect(
  6. Request.RawUrl + "?aa=1&bb=2&cc=3&aa=" + HttpUtility.UrlEncode("5,6,7"), true);
  7.  
  8. StringBuilder sb = new StringBuilder();
  9. foreach( string key in allkeys )
  10. sb.AppendFormat("{0} = {1}<br />",
  11. HttpUtility.HtmlEncode(key), HttpUtility.HtmlEncode(Request.QueryString[key]));
  12.  
  13. this.labResult.Text = sb.ToString();
  14. }

HttpResponse

我们处理HTTP请求的最终目的只有一个:向客户端返回结果。而所有需要向客户端返回的操作都要调用HttpResponse的方法。 它提供的功能集中在操作HTTP响应部分,如:响应流,响应头。
我把一些认为很重要的成员简单列举了一下:

  1. // 获取网页的缓存策略(过期时间、保密性、变化子句)。
  2. public HttpCachePolicy Cache { get; }
  3.  
  4. // 获取或设置输出流的 HTTP MIME 类型。默认值为“text/html”。
  5. public string ContentType { get; set; }
  6.  
  7. // 获取响应 Cookie 集合。
  8. public HttpCookieCollection Cookies { get; }
  9.  
  10. // 获取或设置一个包装筛选器对象,该对象用于在传输之前修改 HTTP 实体主体。
  11. public Stream Filter { get; set; }
  12.  
  13. // 启用到输出 Http 内容主体的二进制输出。
  14. public Stream OutputStream { get; }
  15.  
  16. // 获取或设置返回给客户端的输出的 HTTP 状态代码。默认值为 200 (OK)。
  17. public int StatusCode { get; set; }
  18.  
  19. // 将 HTTP 头添加到输出流。
  20. public void AppendHeader(string name, string value);
  21.  
  22. // 将当前所有缓冲的输出发送到客户端,停止该页的执行,并引发EndRequest事件。
  23. public void End();
  24.  
  25. // 将客户端重定向到新的 URL。指定新的 URL 并指定当前页的执行是否应终止。
  26. public void Redirect(string url, bool endResponse);
  27.  
  28. // 将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件。
  29. public void TransmitFile(string filename);
  30.  
  31. // 将 System.Object 写入 HTTP 响应流。
  32. public void Write(object obj);

  

这些成员都有简单的解释,应该了解它们。

这里请关注一下属性StatusCode。我们经常用JQuery来实现Ajax,比如:使用ajax()函数,虽然你可以设置error回调函数, 但是,极有可能在服务端即使抛黄页了,也不会触发这个回调函数,除非是设置了dataType="json",这时在解析失败时, 才会触发这个回调函数,如果是dataType="html",就算是黄页了,也能【正常显示】。
怎么办?在服务端发生异常不能返回正确结果时,请设置StatusCode属性,比如:Response.StatusCode = 500;

.net 三大核心对象的更多相关文章

  1. 我心目中的Asp.net核心对象

    转:http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html 阅读目录 开始 HttpRuntime HttpServerUtili ...

  2. spring三大核心学习(一)---控制反转

    记得当年大学时候,java的企业级框架还是ssh的天下(spring,struts和hibernate),但是现在,感觉spring已经完全把那两个框架甩在后边了.用spring的人越来越多,用str ...

  3. Asp.Net WebAPI核心对象解析(三)

    对于.NET的分布式应用开发,可以供我们选择的技术和框架比较多,例如webservice,.net remoting,MSMQ,WCF等等技术.对于这些技术很多人都不会陌生,即时没有深入的了解,但是肯 ...

  4. Spring的三大核心思想:IOC(控制反转),DI(依赖注入),AOP(面向切面编程)

    Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧) 1.IoC是什么?    IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多 ...

  5. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  6. ASP.NET Core的路由[2]:路由系统的核心对象——Router

    ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...

  7. Asp.Net WebApi核心对象解析(上篇)

    生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...

  8. Three.js 入门指南(核心对象)

    推荐大家可以看看这个:http://wenku.baidu.com/link?url=RQU2exzV_EF3GATc3bzQU2o9LGMuCmiN5nUJth5SLG3E2TrxtBLQodJU_ ...

  9. Ajax的核心对象创建步骤

    * Ajax具有核心对象 * XMLHttpRequest对象 * 如何创建XMLHttpRequest对象 function getXhr(){ // 声明XMLHttpRequest对象 var ...

随机推荐

  1. 如何防范自己的IP泄漏

    在正式进行各种“黑客行为”之前,黑客会采取各种手段,探测(也可以说“侦察”)对方的主机信息,以便决定使用何种最有效的方法达到自己的目的.来看看黑客是如何获知最基本的网络信息——对方的IP地址:以及用户 ...

  2. .bat 打开程序

    为什么要用.bat打开程序. 因为一个一个难得点 怎么做 百度的,start 程序路径\程序 改进 点击bat,不显示dos窗口. 新建.vbs文件 Set shell = Wscript.creat ...

  3. (转)RabbitMQ学习之Headers交换类型(java)

    http://blog.csdn.net/zhu_tianwei/article/details/40923131 Headers类型的exchange使用的比较少,它也是忽略routingKey的一 ...

  4. MongoDB经典入门(1)--安装

    一.前言 最近开始学习非关系型数据库MongoDB,却在博客园上找不到比较系统的教程,很多资料都要去查阅英文网站,效率比较低下.本人不才,借着自 学的机会把心得体会都记录下来,方便感兴趣的童鞋分享讨论 ...

  5. 【BZOJ3065】带插入区间k小值

    题意: 带插入,修改的区间k小值在线查询 原序列长度<=35000,插入个数<=35000,修改个数<=70000,0<=权值<=70000 题解: Orz vfleak ...

  6. [LUOGU2730] 魔板

    搜索水题.因为只有8个数,排列一共有40320种,直接bfs,判重就行了. 但是判重的时候直接用8进制表示的话要88的bool数组.这种操作太low了,于是我们可以用康托展开,降成8!. 康托展开其实 ...

  7. Hibernate 事务和并发控制

    首先关于Hibernate事务控制,下面是非常权威的资料, https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch02.html ...

  8. ibatis的批处理

    (1)spring模式:尽管spring已经配置了事务,但以下代码中还是要设置事务,不然batch不会起作用;另外这里虽然设了一下事务处理,但对全局事务并不会造成影响;注:不启用事务将建立多次连接,这 ...

  9. WCF与各语言通信框架比较

  10. JS 正则表达式的位置匹配ZZ

    http://regexpal.com/ 上面这个网站可以用于在线检测JS的正则表达式语法 除了熟知的几个固定字符表示位置: ^ : Match the beginning of the string ...