• System.Web Namespce


    System.Web概述

    System.Web是.NET中web应用开发的一个基础类库,定义浏览器与服务器之间的所有操作方法,包括请求输入流(HttpRequest)、输出流(HttpResponse)和上下文管理类(HttpContext)等于HTTP请求相关的类。

    只有添加了对System.Web命名空间的引用,开发人员才可以在程序中处理与HTTP请求相关的信息。引用命名空间的代码如下,其中“using”是加载命名空间的关键字,后面是命名空间的全称。

    using System.Web;

     

    客户端发送的HTTP信息集合:HttpRequest类

    HttpRequest类管理着客户端发送的HTTP信息集合,包括Cookies、HTTP头信息和主体信息等。通过HttpRequest的Browse属性还可以获取客户端浏览器的一些基本信息。

    HttpRequest还可以登陆到网络上其他服务器,然后结合网络操作的一些其他类,通过HTTP获取其他网站的信息。这一点在未来的Web服务应用中特别重要。

    语法定义

    HttpRequest类的定义特别简单,具体语法定义如下:

    Public sealed class HttpRequest

    使用HttpRequest类的构造函数语法如下:

    public HttpRequest(string filename,string url,string querystring)

    参数“filename”表示请求的文件详细路径

    参数“url”表示当前请求的URL的名称

    参数“querystring”表示请求的变量,指所请求URL中“?”后所有的变量

    在实际的应用中,通常不需要创建自己的HttpRequest实例,因为其方法和属性由其他类(如Page和HttpContext)的Request属性提供。 

    方法详解

    HttpRequest类主要用来获取HTTP请求的信息,所以要求的属性特别多,而方法主要是进行一些必需的转换,下面是HttpRequest类中常用的方法及其说明。

    BinaryRead: 用二进制读取当前输入流

    MapPath :虚拟路径到物理路径的映射

    SaveAs :将Http请求保存在到磁盘

    ValidateInput :对访问的数据进行验证

    典型应用:

    HttpRequest类并不需要专门实例化,而是采用Page和HttpContext等类的Request属性来实现其基本方法和属性。本例就是使用Page类的Request属性来完成HttpRequest类的实例。

    Response.Write("参数的值为: " +Request.QueryString["name"]+"<br/>") ;获取页面传递参数并显示
    
    Response.Write("当前URL为:" +Request.Url+"<br/>") ;//获取当前的URL
    
    Response.Write("客户端IP为:" +Request.UserHostAddress+“<br/>" );  //获取客户端的IP
    
    Response.Write("输入流的字节数位:" +Request.TotalBytes+ "<br/>");  //获取输入流的总字节数
    
    Response.Write("服务器第一个KEY:" +Request.ServerVariables.AllKeys[0]+"<br/>"); //获取服务器变量集合中的第一个变量
    
    Request.SaveAs(@"C:	est.txt",true); //页面传递过来的请求保存在文件中 
    

     

    个人总结:HttpRequest类是一个请求类,用户通过Http协议访问web服务期间包含很多的http请求信息,这个类可以所是这些信息的封装体,我们可以通过HttpRequest类访问那些请求信息,如Request.Url、Request.QueryString["name"]等。  

    服务器返回的Http信息:HttpReponse

    HttpReponse类管理着服务器对Http请求的响应,并提供一些方法和属性操作这些返回数据。在实际应用中,一般不实例化HttpRepsonse类,而是通过Page、HttpContext等的Request属性获得其属性和方法,这与HttpRequest类相同。

    语法定义:

    HttpResponse类,其语法定义如下:

    public sealed class HttpReponse

    使用HttpResponse类的构造函数如下:

    public HttpReponse(TextWriter writer)

    参数writer表示输出内容的字符编辑器。

    属性详解:

    HttpResponse类包含很多非常重要的应用程序属性,如当前服务器的缓冲和缓冲的配置等。下面列出这些属性及其说明:

    Buffer :是否缓冲输出,完成响应之后再发出

    BufferOutput :是否缓冲输出,完成页面后再发送

    Cache:网页的缓存策略

    Charset :设置输出流的http字符集

    ContentEncoding:流的内容编码格式

    ContentType:控制流的HTTP MIME类型

    Cookies :获取响应的Cookie集合

    Expires :获取缓存过期的时间

     

    方法详解:

    HttpRepsonse类主要用来封装HTTP的响应信息,由于牵扯到缓冲的一些配置,所以在方法中添加了很多对缓存的处理。这在C#2.0中非常重要,因为缓存技术是提高Web性能的关键。下面对HttpResponse类中常用的方法及其说明:

     典型应用:使用HttpResponse将网页内容导出到Word

    利用HttpResponse的Write方法和BinaryWrite方法,使用HttpResponse可以轻松地实现网页的导出功能,包括导出到PDF、Word和Excel等。其中BinaryWrite方法一般导出的图像类型的文件,而Write方法主要用来导出普通字符串。本例的功能就是使用Write方法将文本框的内容导出到Word中,这种功能通常用在文本编辑器中。

    Response.Clear();  //清空无关信息
    
    Response.Buffer = true;  //完成整个响应后再发送
    
    Repsonse.Charset ="GB2312"; //设置输出流的字符集:中文
    
    Response.AppendHeader("Content-Disposition","attachment;filename=Report.doc"); //追加头信息
    
    Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流字符集
    
    Response.ContentType = "application/ms-word";  //输出流的MIME类型
    
    Response.Write(TextBox1.Text);
    
    Response.End(); //停止输出
    

    应用程序状态:HttpApplicationState类

    HttpApplicationState类管理所有会话共享的信息,即应用程序域级的信息,凡是访问次应用的会话都可以访问这些信息。可以说HttpApplicationState类是一个数据存储库,将信息存储在服务器的内存中。这就保证了数据的读取速度。HttpApplicationState类主要通过其内部对象“Application”来读取和保存数据,保存数据的类型为“Object”,在读取时必须进行正确的类型转换。

    语法定义:

    HttpApplicationState类,其语法定义如下:

    public sealed class HttpApplicationState:NameObjectCollecionBase

    "NameObjectCollectionBase"是应用程序状态的基类,表示键/值对的组合,所有值的类型都是Object。由于其继承接口ICollecion,所以可以通过索引方法访问这些集合数据。

    HttpApplicationState类的使用通过其内部对象“Application”完成,示例如下:

    Application["ApplicationName"] = "School";

    属性详解:

    由于HttpApplicationState存储的内容属于键/值对,所以其属性和大多数键/值对集合的成员相似,都具备Keys,Item和Count等属性。下面列出这些属性及其说明:

    AllKeys :访问数据集合的所有键

    Contents :获取数据集合的内容

    Count : 获取数据集合中的数据总数

    Item : 获取数据集合中某项

    Keys : 获取键集合  方法详解:

    既然需要在HttpApplicationState中存储数据,就必须具备添加、删除等数据的常用方法。

    Add :添加数据到集合中

    Clear : 清空集合中的数据

    Get :通过索引获取集合中的数据

    GetKey:通过键值获取数据

    Lock :锁定集合,保持数据更新的同步

    Remove :移除某变量

    RemoveAll:移除所有的变量

    RemoveAt :按索引移除集合中的某变量

    Set :设置集合中某变量的值

    UnLock :接触对集合的锁定

    下面的代码演示如何使用HttpApplicationState类中的方法:

    Application.Add("name","cgj");  //添加一对键值
    
    Response.Write(Application.Get("name").ToString()); //返回键的值
    
    Application.Add("age","12");  //再添加一对键值
    
    Response.Write(Application.GetKey(0).ToString());  //返回第一个键的名称
    
    Application.Lock();  //锁定应用程序状态,保持修改同步
    
    Application.Set("name","chengj");  //修改键name的值
    
    Application.UnLock();  //解锁
    
    Application.RemoveAt(0); //移除第一个键值对
    

    典型应用:用HttpApplicationState类保存数据库连接串

    数据库连接串是一个应用程序级的变量。为了保证所有会话都可以访问,本例将其存放在HttpApplicationState类中。这并不是最好的解决方案,因为.NET支持字符串存放在配置文件中,达到全局调用的目的。

    在应用程序开始的事件中“Application_Start”中,书写如下代码,主要用来添加连接字符串的键/值对:

    if(Application["ConnString"]==null)

       Application["connString"] ="Data sourse=SERVER;Initial Catalog=Mis;uid=sa;pwd=;";

    在Default.aspx页的代码视图中,

    If(Application["ConnString"]!=null)

       Response.Write(Application["ConnString"].ToString());

    企业级应用:

          /// <summary>
            /// 把对象放入到缓存中
            /// </summary>
            /// <typeparam name="T">WAFObject类型</typeparam>
            /// <param name="t">WAFObject对象</param>
            internal static void SetUserObject<T>(T t) where T : WAFObject
            {
                if (HttpContext.Current != null)
                {
                    string guid = LoginUser.Guid;
                    if (HttpContext.Current.Application[guid] == null) 
                      HttpContext.Current.Application.Add(guid, new SortedList<string, WAFObject>());
    
    
    
                    SortedList<string, WAFObject> list = HttpContext.Current.Application[guid] as SortedList<string, WAFObject>;
                    string key = typeof(T).FullName;
                    if (list.ContainsKey(key))
                    {
                        list[key] = t;
                    }
                    else
                    {
                        list.Add(key, t);
                    }
                }
            }
    

    HttpCookie类

    Cookie也用来保存数据,但只针对单一用户。其保存的也是键/值对的集合,与HttpApplicationState类最大的区别就是有效期。Application对象没有任何有效期,只有删除才算这个对象的过期,而Cookie在创建时,可以指定这对键/值的过期时间。Cookie一般用来保存登陆的用户名和密码,这样在下次登陆时,就不需要再次填写。这样提高了用户的工作效率,但存在一定的安全性问题。

    语法定义

    public sealed class HttpCookie

    HttpCookie类的构造函数有两种:一种是不为键赋值,另一种是指定键/值对。函数代码分别如下:

    public HttpCookie(string name)

    public HttpCookie(string name,string value)

    属性详解:

    HttpCookie类包含访问内部键/值对的一些属性,如键的值、过期时间等。

    Expires : Cookie的有效期

    HasKes :判断Cookie是否具备子键

    Item :按索引访问Cookie集合中的变量

    Name:Cookie的名称

    Path :与Cookie一同传输的虚拟路径

    Secure :是否使用Http传输Cookie

    Value : 指定Cookie的值

    Values :Cookie的值集合

    典型应用:用HttpCookie保存用户的登陆信息

    HttpCookie的主要应用是保存当前登陆用户的一些常用信息,这些信息将保存在客户端的机器上。本例通过演示如何保存当前的登录名和密码。

    Request.Cookies.Clear();  //清空所有Cookie
    
    HttpCookie myname = new HttpCookie("UserInfo");  //创建HttpCookie的实例
    
    myname["name"] = TextBox1.Text;  //保存变量
    
    myname["pass"] = TextBox2.Text;/
    
    myname.Expires = DateTime.Now.AddHours(1);  //设置Cookie的过期时间
    
    Repsonse.Cookies.Add(myname);  //添加到web请求的Cookie集合中
    
    注意:配置好HttpCookie后,需要将其添加到Web请求的Cookies集合中
    
    在Page_Load事件中,获取保存的Cookie,代码如下
    
    if(Request.Cookies["UserInfo"]!=null)
    
    {
    
         //获取用户名和密码
    
         TextBox1.Text = Request.Cookies["UserInfo"]["name"].ToString();
    
         TestBox2.Text = Request.Cookies["UserInfo"]["pass"].ToString();
    
    }
    

    URL的编码/解码:HttpUtility类

    HttpUtility类主要提供对URL进行编码和解码的方法,这是出于对URL数据安全性的考虑,因为编码后的数据无法被轻易地识别,如果想读取URL的数据,必须再对其进行解码。这样也防止了Web客户端的脚本注入。HttpUtility类中全是编码和解码的方法,包括字符串的编码、字节数组的编码等。此类没有提供任何属性。

    语法定义

    HttpUtility类的语法定义如下:

    public sealed class HttpUtility

    “sealed”关键字表示此类是密封类,不能被继承。

    通常调用HttpUtility类的对象并不是通过实例化类完成的,而是通过调用内部的“Sever”对象,使用其公开的方法和属性,但是Server并没有完全支持这些方法。

    HttpUtility类的内部方法多是静态方法,这保证了无须实例化,就可以使用这些方法。如下所示:

    HttpUtility.HtmlEncode(“This is test”);

    方法详解

    HttpUtiity类主要实现字符和URL等数据的编码和解码,具体的方法如下:

    HtmlDecode:对字符串的解码

    HtmlEncode:对字符串的编码

    ParseQueryString :分解查询字符串

    UrlDecode :对URL传输的字符串解码

    UrlDecodeToBytes:对URL传输的数据解码成字节组

    UrlEncode :对URL传输的字符串编码

    UrlEncodeToBytes :对URL传输的数据编码成字节组

    UrlEncodeUnicodeToBytes:将Unicode数据转换为字节数组

    UrlPathEncode :对传输路径的编码

    下面演示如何使用HttpUtlity类中的方法:

    HttpUtiltiy.HtmlEncode("this is test");

    HttpUtility.HtmlDecode("this");

    HttpUtility.UrlEncode("the world");

    HttpUtility.UrlDecode("the world");

    HttpUtility.UrlEncodeUnicode("the world");

    NameValueCollection  myValue = HttpUtility.ParseQueryString("name=cgj&age=28");

    典型应用:使用页面传递中文参数

    在页面之间传递中文一直是比较麻烦的事情,主要原因有两个原因:一是安全性,二是经常会出现乱码。在使用Javascript时,可以通过函数“escape”解决这个问题。在C#中可以使用HttpUtility类轻松解决次问题,通常比较大得网站都采用这种模式。

    实现页面之间的传递,Default.aspx页面:

    string strurl ="Default2.aspx";

    string name = HttpUtility.UrlEncode("刘千千");//编码

    string type = HttpUtility.UrlEncode("计算机工程师");

    Reponse.Redirect(strurl + "name=" +name+"&type=" +type);  //导航

    打开“Default2.aspx”页,在其“Page_Load”事件中书写获取传递参数的代码,如下所示:

    Response.Write(Request.Query["name"]);  //获取参数name

    Response.write(Request.Query["type"]);  //获取参数type

    按F5运行程序,可以看到页面的URL已经不再显示值的内容了,而是显示一些杂乱的编码。这就保证了参数的安全性。

     

     上传文件的管理:HttpPostedFile

    HttpPostedFile类管理的是客户端上传的单个文件,而对所有文件的管理则交给了“HttpFileCollection”类,其实HttpPostedFile类就是HttpFileCollection类的个体。

    通过HttpPostedFile类可以获取上传文件的一些属性,如大小、文件名等。还能利用此类提供的“SaveAs”方法保存文件。

    语法定义:

    HttpPostedFile类的语法定义如下:

    public seald class HttpPostedFile

    在实际的应用中,通常不需要通过new 来构造此类的实例,而是使用“FileUpload”控件的“PostedFile”属性获得。使用方法如下:

    HttpPostedFile myfile = FileUpload1.PostedFile;

    属性详解:

    HttpPostedFile类的属性用来描述上传文件的一些基本信息。

    ContentLength : 上传文件的长度

    ContentType : 文件的MIME类型

    FileName : 文件的路径名称

    InputStream : 读取文件的Stream流

    方法详解:

    HtttPostedFile类主要用来获取上传文件的信息,目前只提供一个“SavaAs”方法,用来将上传的文件保存到服务器。

    SaveAs的使用语法如下:

    public void SaveAs(string filename)

    参数“filename”表示目标路径和文件名。

    下面的代码演示如何使用SaveAs方法:

    myfile.SaveAs(@"c: est.doc");

    典型应用:根据上传文件的大小实现不同处理。

    HttpPostedFile myfile = FileUpload1.PostedFile;   //获取上传文件实例
    
    //获取文件名
    
    string filename = myfile.FileName.Substring(myfile.FileName.LastIndexOf(@"")+1);
    
    if(myfile.ContentLength>1024000)   //判断文件大小 ,大于1MB 
    
       myfile.SaveAs(@"C:BigFile" + filename);  //C盘下必须有文件夹“BigFile”
    
    else
    
        myfile.SaveAs(@"C:SmallFile" + filename);  //C盘下必须有文件夹“SmallFile”
    
    Response.Write("保存成功");
    

    应用程序的运行时服务:HttpRuntime

    HttpRuntime类用来提供ASP.NET的运行时服务,主要针对的是当前运行的应用程序。通过此类提供的方法和属性,可以获得应用程序的一些基本信息。HttpRuntime类中最重要的是方法“ProcessRequest”,用来处理所有的Web后续操作。通过了解次方法,可以了解应用程序的运行过程。

     

     

     

    封装HTTP请求的信息:HttpContext

    HttpContext是Web应用中很重要要的一个类,之所以将其放在后面讲,是因为其属性是很多类的实例对象,“HttpResponse”、“HttpRequest”和"TraceContext"等。下面重点介绍HttpContext的属性,其封装了Http请求的所用信息。

    HttpContext类管理着Http请求的所有属性,包括请求的输入流、输出流、当前请求的用户和缓存对象等。HttpContext类是web请求的上下文环境,每一次请求都伴随一个HttpContext对象,用来封装请求的相关信息。这些信息如果要分类,主要有响应类(Response)、请求类(Request)、会话类(Session)、缓存类(Cache)和跟踪类(Trace)等。当请求结束时,这个请求的HttpContext对象也就消失了。

    语法定义

    HttpContext类的语法定义如下:

    public sealed class HttpContext:IServiceProvider

    "sealed"关键字表示此类时封闭类,不能被继承。HttpContext类实现接口“IServiceProvider”,其用来检索服务对象。

    在使用HttpContext类时,通常不需要初始化,对其属性和成员可以直接调用。HttpContext类的调用语法如下:

    HttpRequest myreq = HttpContext.Current.Request;

    属性详解

    HttpContext类描述了当前请求中的所有属性,下面列出这些属性及其说明。

    AllErrors : Http请求中发生的所有错误

    Application:当前Http请求的Application对象

    ApplicationInstance :为当前Http设置Application对象

    Cache:当前http的Cache对象

    Current:当前http的HttpContext对象

    Error :当前请求的第一个错误

    IsCustomErrorEnabled :是否启用自定义错误

    IsDebuggingEnabled :是否处于调试模式

    Items :Http请求的项集合

    Profile :当前用户的配置文件

    Request :当前请求的HttpRequest对象

    Reponse:当前请求的HttpReponse对象

    Server :用于处理请求的编码对象

    Session:当前请求的Session对象

    SkipAuthoriaztion:是否跳过授权检查

    TimeStamp:当前请求的初始时间戳

    Trace :当前响应的TraceContext对象

    User :设置当前用户信息

     方法详解

    HttpContext类的方法主要获取一些配置信息,其中最重要的方法是“RewritePath” ,用来重定向URL。

    下面对HttpContext类的常用的方法进行说明

    AddError :将错误信息添加到错误集合

    ClearError :清空错误信息

    GetAppConfig : 获取当前应用程序的配置信息。

    GetConfig:获取当前请求的配置信息

    GetGlobalResourseObject: 获取应用程序级资源。

    GetLocalResourseObject :获取页面级资源。

    GetSection :获取配置节信息

    RewritePath :重写路径.

     

    HTTP处理程序:IHttpHandler接口

    IHttpHandler接口主要用来自定义HTTP处理程序。例如当用户访问某一页面时,程序员可以通过实现此接口的方法“ProcessRequest”,来重新处理是否让用户看到则一页。

    自定义处理程序可以用符合CLS规范的任何语言编写。当编写完成自定义的处理程序后,用户的请求不再通过ASP.NET的页面来响应,而是通过IHttpHanlder接口实现的“ProcessRequest”方法来响应。

    IHttpHandler的用途很广泛,例如比较流行的Blog注销技术和特殊扩展名的访问技术。这些技术都是通过实现IHttpHandler接口,来达到页面的处理功能。

    语法定义:

    IHttpHandler是一个接口,其定义如下

    public interface IHttpHandler

    接口一般用来封装一些固定的操作方法,但并不实现这些方法,所以继承此接口的类必须实现接口中定义的方法。IHttpHandler接口定义的内容如下,其中包括一个属性和一个方法。

    #region IHttpHandler成员

    bool IHttpHandler.IsReusable

    {

        get{ throw new Exception("The mothod or operation is not implemented."); }

    }

    void IHttpHandler.ProcessRequest(HttpContext context)

    {

        throw new Exception("the method or operation is not implemented");

    }

    #endregion

     方法详解:

    IHttpHnndler接口只有一个方法"ProcessRequest",主要用来处理Web请求。其语法定义如下:

    void ProcessRequest(HttpContext context)

    方法的参数"context"是当前HTTP请求的上下文,包括缓存、当前请求和响应等。

    ProcessRequest方法是IHttpHandler接口的关键所在。在Web中常看到的Page类,就继承了IHttpHanlder接口,并实现了自己的ProcessRequest方法。通过了解此接口,也能更好地了解WebPage页面的运行原理。

    典型应用:用IHttpHandler实现Blog的注销技术

    所谓的Blog注销技术,其实就是当用户单击"注销"按钮时,页面URL显示的是注销界面,而实际上并没有这个注销页的存在,这就是利用IHttpHandler接口技术。

    双击"注销"按钮,切换到其Click事件的代码视图,书写如下:

    Response.Redirect("SigeOut.aspx");  注意:网站中不存在"SigeOut.aspx"这个网页。

    在网站的根目录下,添加一个类"SigeOutHandler",系统会询问是否将类保存在"App_Code"目录中,选择"是"。

    设计“SigeOutHandler”类的代码如下,其中实现了接口“IHttpHandler”中的方法“ProcessRequest”。

    using system;
    
    using System.Web;
    
    using System.Web.Security;
    
    public class SigeOutHandler : IHttpHandler
    
    {
    
        public SigeOutHandler(){}
    
         bool IHttpHandler.IsReusable//使用上下文缓存
    
         {
    
              get{return true;}
    
         }
    
        void IHttpHandler.ProcessRequest(HttpContext context) 
    
        {
    
             FormsAuthentication.SignOut();         //删除验证票据
    
              HttpContext.Current.Response.Write("您已经成功注销");  //显示成功信息
    
        }
    
    }
    

    在Web.Config文件中的“system.web”节点下,添加用户自定义处理的配置,如下所示:

    <httpHandler>

      <add verb ="*" path ="SigeOut.aspx" type = "SigeOutHandler"/>

    </httpHandler>

    注意:本例中使用了登陆用户控件,需要在Web.Config中设置登陆模式为“Forms”。

    注册一个用户登陆,然后单击“注销”按钮,此时网页显示的页面URL是“http://localhost/HttpHandleSample/SigeOut.aspx”,但实际上并不存在这个页面,所有的处理都是在“ProcessRequest”方法中实现的。

     

    Http处理模块:IHttpModule接口

  • 相关阅读:
    [python] defaultdict
    [VM workstation]VM workstation 中的虚拟机连不上网络
    [Docker] docker 基础学习笔记1(共6篇)
    [python] import curses
    servlet 产生随机验证码
    JSTL标签库 sql标签
    JSTLLearning
    Ajax实现联想(建议)功能
    HDU 1241
    Servlet实现文件上传
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/4650854.html
Copyright © 2020-2023  润新知