Asp.net三大核心对象: HttpContext, HttpRequest, HttpResponse

Asp.net有三大核心对象:HttpContext, HttpRequest, HttpResponse。
另外两个重要的对象:HttpRuntime,HttpServerUtility

一: HttpRuntime

       公开了一个静态方法 UnloadAppDomain() ,这个方法可以让我们用代码重新启动网站。 通常用于用户通过程序界面修改了一个比较重要的参数,这时需要重启程序了。

       HttpRuntime公开了一个大家都熟知的静态属性 Cache,平常用的Page.Cache或者HttpContext.Cache事实上都是HttpRuntime.Cache的【快捷方式】。HttpRuntime.Cache是个非常强大的东西,主要用于缓存一些数据对象, 提高程序性能。虽然缓存实现方式比较多,一个static变量也算是能起到缓存的作用,但HttpRuntime.Cache的功能绝不仅限于一个简单的缓存集合,其中缓存依赖功能算是个特性强大的功能。更有意义的是:它缓存的内容还可以在操作系统内存不足时能将一些缓存项释放(可指定优先级),从而获得那些对象的内存,并能在移除这些缓项时能通知您的代码。

        HttpRuntime.Cache还有个非常酷的功能是:它并非只能在Asp.net环境中使用,也能在其它编程模型中使用,比如大家熟知的WinForm编程模型。 如何使用呢,直接访问HttpRuntime.Cache这个静态属性肯定是不行的。我们只要在程序初始化时创建一个HttpRuntime的实例,当然还要保证它不会被GC回收掉。 然后就可以像在Asp.net中一样使用HttpRuntime.Cache了,就这么简单。是的,就是这样简单,您就可以在其它编程模型中使用Cache的强大功能: 线程安全的集合,2种过期时间的选择,缓存依赖,内存不足时自动释放且有回调通知。

       可能还有人会担心往Cache里放入太多的东西会不会影响性能,因此有人还想到控制缓存数量的办法。我只想说: 缓存容器决定一个对象的保存位置是使用Hash算法的,并不会因为缓存项变多而影响性能,更有趣的是Asp.net的Cache的容器还并非只有一个, 它能随着CPU的数量而调整,看这个架式,应该在设计Cache时还想到了高并发访问的性能问题。

HttpServerUtility

HttpServerUtility的实例通常以Server的属性公开, 但它的提供一些Encode, Decode方法其实调用的是HttpUtility类的静态方法。

  1. HttpUtility公开了一些静态方法,如: 
    HtmlEncode(),应该是使用频率比较高的方法,用于防止注入攻击,它负责安全地生成一段HTML代码。 
    有时我们还需要生成一个URL,那么UrlEncode()方法就能派上用场了,因为URL中并不能包含所有字符,所以要做相应的编码。 
    HttpUtility还有一个方法HtmlAttributeEncode(),它也是用于防止注入攻击,安全地输出一个HTML属性。 
    在.net4中,HttpUtility还提供了另一个方法:JavaScriptStringEncode(),也是为了防止注入攻击,安全地在服务端输出一段JS代码。
  2. HttpUtility还公开了一些静态方法,如: 
    HtmlDecode(), UrlDecode(),通常来说,我们并不需要使用它们。尤其是UrlDecode ,除非您要自己的框架,一般来说, 在我们访问QueryString, Form时,已经做过UrlDecode了,您就不用再去调用了。
  3. HttpServerUtility除了公开了比较常用的Encode, Decode方法外,还公开了一个非常有用的方法:Execute(),是的,它非常有用, 尤其是您需要在服务端获取一个页面或者用户控件的HTML输出时。

二 HttpRequest:

          使 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【是一个不区分大小写的集合】,它个集合类型有一个特点:允许在一个键下存储多个字符串值。如:

Response.Redirect( "?aa=1&bb=2&cc=3&aa=" + HttpUtility.UrlEncode("5,6,7"), true);

string aa=Request.QueryString[aa];

aa的值为:"1,5,6,7”

HttpRequest还有二个用于方便获取HTTP数据的属性Params,Item ,它可以让我们在写代码时不必区分是GET还是POST,这二个属性唯一不同的是:Item是依次访问这4个集合,找到就返回结果,而Params是在访问时,先将4个集合的数据合并到一个新集合(集合不存在时创建), 然后再查找指定的结果。

三 HttpResponse:向客户端返回结果。而所有需要向客户端返回的操作都要调用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);

四 HttpContext【在任何地方都能找到】 –>派生 HttpRequest, HttpResponse, HttpServerUtility, Cache属性 User, Items, Current

User:保存于当前请求的用户身份信息,如果判断当前请求的用户是不是已经过身份认证,可以访问:Request.IsAuthenticated这个实例属性。

Items:datatype字典,因此适合以Key/Value的方式来访问,不同的请求之间,数据不会被共享。

Current:是HttpContext在任何地方都能使用其几个主要派生(HttpRequest, HttpResponse, Server, Cache)的关键

 

另外,在webapi中,很多属性都没有。这里如何获取post的数据,我把方法记一下。一般都会自动转成对象,在action中使用的。

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
    string jsonContent = content.ReadAsStringAsync().Result;
}
借鉴:https://blog.csdn.net/sinat_16998945/article/details/79620902

           http://www.cnblogs.com/fish-li/archive/2011/08/21/2148640.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值