zoukankan      html  css  js  c++  java
  • .net 三大核心对象

    .net 三大核心对象

    HttpRequest

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

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

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

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

    // 获取服务器上 ASP.NET 应用程序的虚拟应用程序根路径。
    public string ApplicationPath { get; }
    
    // 获取应用程序根的虚拟路径,并通过对应用程序根使用波形符 (~) 表示法(例如,以“~/page.aspx”的形式)使该路径成为相对路径。
    public string AppRelativeCurrentExecutionFilePath { get; }
    
    // 获取或设置有关正在请求的客户端的浏览器功能的信息。
    public HttpBrowserCapabilities Browser { get; set; }
    
    // 获取客户端发送的 cookie 的集合。
    public HttpCookieCollection Cookies { get; }
    
    // 获取当前请求的虚拟路径。
    public string FilePath { get; }
    
    // 获取采用多部分 MIME 格式的由客户端上载的文件的集合。
    public HttpFileCollection Files { get; }
    
    // 获取或设置在读取当前输入流时要使用的筛选器。
    public Stream Filter { get; set; }
    
    // 获取窗体变量集合。
    public NameValueCollection Form { get; }
    
    // 获取 HTTP 头集合。
    public NameValueCollection Headers { get; }
    
    // 获取客户端使用的 HTTP 数据传输方法(如 GET、POST 或 HEAD)。
    public string HttpMethod { get; }
    
    // 获取传入的 HTTP 实体主体的内容。
    public Stream InputStream { get; }
    
    // 获取一个值,该值指示是否验证了请求。
    public bool IsAuthenticated { get; }
    
    // 获取当前请求的虚拟路径。
    public string Path { get; }
    
    // 获取 HTTP 查询字符串变量集合。
    public NameValueCollection QueryString { get; }
    
    // 获取当前请求的原始 URL。
    public string RawUrl { get; }
    
    // 获取有关当前请求的 URL 的信息。
    public Uri Url { get; }
    
    // 从 QueryString、Form、Cookies 或 ServerVariables 集合中获取指定的对象。
    public string this[string key] { get; }
    
    // 将指定的虚拟路径映射到物理路径。
    // 参数:  virtualPath:  当前请求的虚拟路径(绝对路径或相对路径)。
    // 返回结果:  由 virtualPath 指定的服务器物理路径。
    public string MapPath(string virtualPath);
    

      

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

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

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

    HttpResponse

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

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

      

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

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

  • 相关阅读:
    mysql中文乱码
    阻止保存要求重新创建表的更改
    PowerDesigner连接数据库(Oracle)
    PowerDesigner连接数据库(SqlServer)
    Environment Variable: "PATH" 失败
    pl/sql查看锁表及解锁
    Oracle将误闪的数据认回到指定的时间段
    内存监测2
    Windows常用的一些DOC命令
    何为序列化
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/9504889.html
Copyright © 2011-2022 走看看