好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

了解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

作者: Artech
出处: http://artech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

分类:  [01] 技术剖析

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于了解ASP.NET MVC几种ActionResult的本质:HttpStatusCodeResul的详细内容...

  阅读:47次