了解ASP.NET MVC几种ActionResult的本质:HttpStatusCodeResult & RedirectResult/RedirectToRouteResult

在本系列的最后一篇,我们来讨论最后三个ActionResult:HttpStatusCodeResult、RedirectResult和RedirectToRouteResult

。第一个用于实现针对某个HTTP状态的响应,而后两个用于实现重定向。至于重定向,又分为“暂时重定向”和“永久重定向”,按照响应状态,又称“302重定向”和“301重定向”。[本文已经同步到《How ASP.NET MVC Works?》中]

目录
一、HttpStatusCodeResult
二、RedirectResult
三、RedirectToRouteResult
四、“302重定向”V.S.“301重定向”

一、HttpStatusCodeResult

每一个HTTP响应均具有一个表示响应状态的代码和一个可选的状态描述,正常情况下返回“200

OK”。System.Web.Mvc.HttpStatusCodeResult使我们很容易地返回一个指定状态的HTTP响应。如下面的代码片断所示,HttpStatusCodeResult具有StatusCode和StatusDescription两个只读的属性分别表示响应状态码和状态描述信息。在构造函数中既可以将状态码设置成一个整数,也可以以HttpStatusCode枚举形式来指定状态码。

   1: public class HttpStatusCodeResult : ActionResult
   2: {    
   3:     public HttpStatusCodeResult(int statusCode);
   4:     public HttpStatusCodeResult(HttpStatusCode statusCode);
   5:     public HttpStatusCodeResult(int statusCode, string statusDescription);
   6:     public HttpStatusCodeResult(HttpStatusCode statusCode, string statusDescription);
   7:  
   8:     public override void ExecuteResult(ControllerContext context);
   9:     
  10:     public int         StatusCode { get; }
  11:     public string      StatusDescription { get;}
  12: }

HttpStatusCodeResult实现在ExecuteResult方法中的请求响应逻辑很简单,如下面的代码片断所示,它仅仅是设置了当前HttpResponse的StatusCode和StatusDescription而已。有一点值得一提的是,如果我们采用Visual
Studio的Development
Server作为Web应用的宿主,通过HttpStatusCodeResult的StatusDescription属性设置的状态描述信息不会反映HTTP响应中,只有采用IIS作为宿主才会真正将此信息写入响应消息。

   1: public class HttpStatusCodeResult : ActionResult
   2: {
   3:     //其他成员
   4:     public override void ExecuteResult(ControllerContext context)
   5:     {      
   6:         context.HttpContext.Response.StatusCode = this.StatusCode;
   7:         if (this.StatusDescription != null)
   8:         {
   9:             context.HttpContext.Response.StatusDescription = this.StatusDescription;
  10:         }
  11:     }
  12: }

HttpStatusCodeResult具有两个子类,一个基于响应状态“404, Not
Found”的System.Web.Mvc.HttpNotFoundResult,另一个是基于响应状态“401, Not
Authorized”的System.Web.Mvc.HttpUnauthorizedResult,第7章“Action的执行”中筛选器AuthorizeAttribute在授权检验失败的情况下返回的就是一个HttpUnauthorizedResult对象。

二、RedirectResult

RedirectResult帮助我们实现针对某个地址的重定向,其作用与调用HttpResonse的Redirect/RedirectPermanent方法完全一致。如下面的代码片断所示,RedirectResult具有两个只读属性Permanent和Url,前者表示采用永久重定向还是暂时重定向,默认值为False,后者表示重定向的目标地址,既可以采用绝对地址(比如http://www.asp.net),也可以采用相对地址(比如~/account/register)。

   1: public class RedirectResult : ActionResult
   2: {    
   3:     public RedirectResult(string url);
   4:     public RedirectResult(string url, bool permanent);
   5:     public override void ExecuteResult(ControllerContext context);
   6:   
   7:     public bool       Permanent { get; }
   8:     public string     Url { get; }
   9: }

暂时重定向和永久重定向可以分别通过调用HttpResponse的Redirect和RedirectPermanent来实现,实际上RedirectResult基于重定向的实现就是通过调用这两个方法来完成的,这可以通过如下所示的ExecuteResult方法的定义看出来。

   1: public class RedirectResult : ActionResult
   2: {
   3:     //其他成员
   4:     public override void ExecuteResult(ControllerContext context)
   5:     {
   6:         //其他操作
   7:         string url = UrlHelper.GenerateContentUrl(this.Url, context.HttpContext);
   8:         if (this.Permanent)
   9:         {
  10:             bool endResponse = false;
  11:             context.HttpContext.Response.RedirectPermanent(url, false);
  12:         }
  13:         else
  14:         {
  15:             bool flag2 = false;
  16:             context.HttpContext.Response.Redirect(url, false);
  17:         }
  18:     }
  19: }

三、RedirectToRouteResult

RedirectResult使我们可以直接重定向到指定的目标地址,另一个类似的RedirectToRouteResult帮助我们根据注册的路由进行重定向。如下面的代码片断所示,RedirectToRouteResult没有了表示重定向目标地址的Url属性,取而代之的是表示路由注册名称和路由参数的RouteName和RouteValues属性,在进行重定向时就是根据这两个属性根据注册的路由解析出具体的重定向地址的。

   1: public class RedirectToRouteResult : ActionResult
   2: {   
   3:     public RedirectToRouteResult(RouteValueDictionary routeValues);
   4:     public RedirectToRouteResult(string routeName, RouteValueDictionary routeValues);
   5:     public RedirectToRouteResult(string routeName, RouteValueDictionary routeValues, bool permanent);
   6:     public override void ExecuteResult(ControllerContext context);
   7:    
   8:     public bool                     Permanent { get; }
   9:     public string                   RouteName { get; }
  10:     public RouteValueDictionary     RouteValues { get; }
  11: }

抽象类Controller中定义了一系列创建RedirectResult/RedirectToRouteResult的方法,比如Redirect/RedirectPermanent方法用于创建重定向到指定URL的RedirectResult,RedirectToAction/RedirectToActionPermanent用于创建重定向到指定的目标Action的RedirectResult/RedirectToRouteResult,而RedirectToRoute/RedirectToRoutePermanen创建的RedirectResult/RedirectToRouteResult对象是针对注册的某个路由的。

四、“302重定向”V.S.“301重定向”

暂时重定向和永久重定向有时又被称为“302重定向”和“301重定向”,302和301表示响应的状态码。当我们调用HttpResponse的Redirect/RedirectPermanent方法时,除了会设置相应的响应状态码之外,还会将重定向的目标地址写入响应报头(Location),浏览器在接收到响应之后自动发起针对重定向目标地址的访问。

   1: public class HomeController : Controller
   2: {
   3:     public ActionResult Redirect()
   4:     {
   5:         return Redirect("http://www.asp.net");
   6:     }
   7:  
   8:     public ActionResult RedirectPermanent()
   9:     {
  10:         return RedirectPermanent("http://www.asp.net");
  11:     }
  12: }

在上面的代码片断中,我们定义了采用暂时重定向和永久重定向的Action方法Redirect和RedirectPermanent,如果我们通过浏览器分别对它们发起访访问,会得到具有如下内容的两个响应。两种重定向的不同作用主要体现在SEO(Search
engine optimization)上,搜索引擎会使用永久重定向目标地址更新自己的索引,对于暂时重定向则不会。

   1: //1、Redirect
   2: HTTP/1.1 302 Found
   3: Server: ASP.NET Development Server/10.0.0.0
   4: Date: Wed, 13 Jun 2012 09:34:15 GMT
   5: X-AspNet-Version: 4.0.30319
   6: X-AspNetMvc-Version: 4.0
   7: Location: http://www.asp.net
   8: Cache-Control: private
   9: Content-Type: text/html; charset=utf-8
  10: Content-Length: 135
  11: Connection: Close
  12:  
  13: <html><head><title>Object moved</title></head><body><h2>Object moved to <a href="http://www.asp.net">here</a>.</h2></body></html>
  14:  
  15: //2、RedirectPermanent
  16: HTTP/1.1 301 Moved Permanently
  17: Server: ASP.NET Development Server/10.0.0.0
  18: Date: Wed, 13 Jun 2012 09:34:40 GMT
  19: X-AspNet-Version: 4.0.30319
  20: X-AspNetMvc-Version: 4.0
  21: Location: http://www.asp.net
  22: Cache-Control: private
  23: Content-Type: text/html; charset=utf-8
  24: Content-Length: 135
  25: Connection: Close
  26:  
  27: <html><head><title>Object moved</title></head><body><h2>Object moved to <a href="http://www.asp.net">here</a>.</h2></body></html>

 

了解ASP.NET MVC几种ActionResult的本质:EmptyResult & ContentResult

了解ASP.NET MVC几种ActionResult的本质:FileResult

了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult

了解ASP.NET MVC几种ActionResult的本质:HttpStatusCodeResult & RedirectResult/RedirectToRouteResult

作者:蒋金楠 

微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文链接

时间: 2024-11-08 19:38:37

了解ASP.NET MVC几种ActionResult的本质:HttpStatusCodeResult & RedirectResult/RedirectToRouteResult的相关文章

了解ASP.NET MVC几种ActionResult的本质:EmptyResult &amp; ContentResult

定义在Controller中的Action方法大都返回一个ActionResult对象.ActionResult是对Action执行结果的封装,用于最终对请求进行响应.ASP.NET MVC提供了一系列的ActionResult,它们本质上是通过怎样的方式来响应请求的呢?这是这个系列着重讨论的主题.[本文已经同步到<How ASP.NET MVC Works?>中] 目录 一.ActionResult对请求的响应 二.EmptyResult 三.ContentResult 四.实例演示:执行返

了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult &amp; JsonResult

在之前的两篇文章(<EmptyResult & ContentResult>和<FileResult>)我们剖析了EmptyResult.ContentResult和FileResult这三种ActionResult是如何将Action执行的结果响应给客户端的.本篇文章着重介绍在进行Ajax调用中经常使用的两个ActionResult,即JavaScriptResult和JsonResult.[本文已经同步到<How ASP.NET MVC Works?>中]

了解ASP.NET MVC几种ActionResult的本质 第四篇

HttpStatusCodeResult & RedirectResult/RedirectToRouteResult 在本系列的最后一篇,我们来讨论最后三个ActionResult:HttpStatusCodeResult.RedirectResult和RedirectToRouteResult .第一个用于实现针对某个HTTP状态的响应,而后两个用于实现重定向.至于重定向,又分为"暂时重定向"和"永久重定向",按照响应状态,又称"302重定向&

了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult &amp;amp; JsonResult

在之前的两篇文章(<EmptyResult & ContentResult>和<FileResult>)我们剖析了EmptyResult.ContentResult和FileResult这三种ActionResult是如何将Action执行的结果响应给客户端的.本篇文章着重介绍在进行Ajax调用中经常使用的两个ActionResult,即JavaScriptResult和JsonResult. 一.JavaScriptResult JavaScriptResult使我们可以

了解ASP.NET MVC几种ActionResult的本质:FileResult

FileResult是一个基于文件的ActionResult,利用FileResult我们可以很容易地将从某个物理文件的内容响应给客户端.ASP.NET MVC定义了三个具体的FileResult,分别是FileContentResult.FilePathResult和FileStreamResult.在这篇文章中我们将探讨三种具体的FileResult是如何将文件内容对请求进行响应的. 一.FileResult 如下面的代码片断所示,FileResult具有一个表示媒体类型的只读属性Conte

了解ASP.NET MVC几种ActionResult的本质:EmptyResult &amp;amp; ContentResult

定义在Controller中的Action方法大都返回一个ActionResult对象.ActionResult是对Action执行结果的封装,用于最终对请求进行响应.ASP.NET MVC提供了一系列的ActionResult,它们本质上是通过怎样的方式来响应请求的呢?这是这个系列着重讨论的主题. 一.ActionResult对请求的响应 HTTP是一个单纯的采用请求/回复消息交换模式的网络协议,Web服务器在接收并处理来自客户端的请求后会根据处理结果对请求予以响应.对于来自客户端的访问请求,

ASP.NET MVC的运行机制

一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在"伪"MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活 ASP.NET MVC是如何运行的[4]: Action的执行 二.URL 路由 ASP.NET的路由系统:URL与物理文件的分离 ASP.

How ASP.NET MVC Works?

一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在"伪"MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活 ASP.NET MVC是如何运行的[4]: Action的执行 二.URL 路由 ASP.NET的路由系统:URL与物理文件的分离 ASP.

一起谈.NET技术,13个不可不知的ASP.NET MVC扩展点

      ASP.NET MVC设计的主要原则之一是可扩展性.处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的.因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以创建自己的服务来支持您的约定,并将其注入到主管线中. 在本文中,我们将从管线开始直到视图呈现,逐一向您展示每个ASP.NET MVC开发者都必须了解13个扩展点. 1.ASP.NET MVC扩展之RouteConstraint 通常情况下你可以使用正则表达式对url参数