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:\test.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:\test.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接口

 

你可能感兴趣的:(System)