您的位置:首页 > 理论基础 > 计算机网络

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

2012-08-16 10:09 489 查看
[code] public class HttpStatusCodeResult : ActionResult

{

public HttpStatusCodeResult(int statusCode);

public HttpStatusCodeResult(HttpStatusCode statusCode);

public HttpStatusCodeResult(int statusCode, string statusDescription);

public HttpStatusCodeResult(HttpStatusCode statusCode, string statusDescription);


 public override void ExecuteResult(ControllerContext context);

 

 public int StatusCode{ get;}

 public stringStatusDescription{ get;}

}

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


[code][code] public class HttpStatusCodeResult : ActionResult

{

 //其他成员

 public override void ExecuteResult(ControllerContext context)

{

 context.HttpContext.Response.StatusCode = this.StatusCode;

 if (this.StatusDescription != null)

{

 context.HttpContext.Response.StatusDescription = this.StatusDescription;

}

}

}

[/code]
[/code]
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)。

[code]
[code] public class RedirectResult : ActionResult

{

 public RedirectResult(string url);

 public RedirectResult(string url, bool permanent);

 public override void ExecuteResult(ControllerContext context);

 

 public bool Permanent{ get;}

 public string Url{ get;}

}

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

[code]
[code] public class RedirectResult : ActionResult

{

 //其他成员

 public override void ExecuteResult(ControllerContext context)

{

 //其他操作

 string url = UrlHelper.GenerateContentUrl(this.Url, context.HttpContext);

 if (this.Permanent)

{

 bool endResponse = false;

 context.HttpContext.Response.RedirectPermanent(url, false);

}

 else

{

 bool flag2 = false;

 context.HttpContext.Response.Redirect(url, false);

}

}

}

[/code]
[/code]

三、RedirectToRouteResult

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

[code]
[code] public class RedirectToRouteResult : ActionResult

{ 

 public RedirectToRouteResult(RouteValueDictionary routeValues);

 public RedirectToRouteResult(string routeName, RouteValueDictionary routeValues);

 public RedirectToRouteResult(string routeName, RouteValueDictionary routeValues, bool permanent);

 public override void ExecuteResult(ControllerContext context);


 public bool Permanent{ get;}

 public string RouteName{ get;}

 public RouteValueDictionary RouteValues{ get;}

}

[/code]
[/code]
抽象类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),浏览器在接收到响应之后自动发起针对重定向目标地址的访问。

[code]
[code] public class HomeController : Controller

{

 public ActionResult Redirect()

{

 return Redirect("http://www.asp.net");

}


 public ActionResult RedirectPermanent()

{

 return RedirectPermanent("http://www.asp.net");

}

}

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

[code]
[code] //1、Redirect

HTTP/1.1 302 Found

Server: ASP.NET Development Server/10.0.0.0

Date: Wed, 13 Jun 2012 09:34:15 GMT

X-AspNet-Version: 4.0.30319

X-AspNetMvc-Version: 4.0

Location: http://www.asp.net[/code] 
Cache-Control: private

Content-Type: text/html; charset=utf-8

Content-Length: 135

Connection: Close


<html><head><title>Object moved</title></head><body><h2>Object moved to <a href="http://www.asp.net">here</a>.</h2></body></html>


//2、RedirectPermanent

HTTP/1.1 301 Moved Permanently

Server: ASP.NET Development Server/10.0.0.0

Date: Wed, 13 Jun 2012 09:34:40 GMT

X-AspNet-Version: 4.0.30319

X-AspNetMvc-Version: 4.0

Location: http://www.asp.net[/code] 
Cache-Control: private

Content-Type: text/html; charset=utf-8

Content-Length: 135

Connection: Close


<html><head><title>Object moved</title></head><body><h2>Object moved to <a href="http://www.asp.net">here</a>.</h2></body></html>

[/code]
[/code]

了解ASP.NET MVC几种ActionResult的本质:EmptyResult & ContentResult
了解ASP.NET MVC几种ActionResult的本质:FileResult
了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult
了解ASP.NET MVC几种ActionResult的本质:HttpStatusCodeResult & RedirectResult/RedirectToRouteResult
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐