AS.NET MVCのいくつかのアクションのResoultの本質を理解します.

15241 ワード

このシリーズの最後の編では、最後の3つのアクションレスリングを議論します.最初は、あるHTTP状態に対する応答を実現するために使用され、その後、2つはリダイレクトを実現するために使用される.リダイレクトについては、「一時リダイレクト」および「永久リダイレクト」に分けられ、応答状態に応じて、「302リダイレクト」および「301リダイレクト」とも称される.[本明細書は『How AS.NET MVC Works?』に同期されている]
目次 一、HttpStuts CodeResult 二、Redirect Result 三、RedirectToRouteResult 四、「302リダイレクト」V.S.「301リダイレクト」
一、HttpStuts CodeResult
各HTTP応答は、いずれも応答状態を表すコードと任意の状態記述を有しており、通常は「200 OK」に戻る.System.Web.Mvc.HttpStatus CodeResultは、指定された状態のHTTP応答に簡単に戻ります.下記のコードクリップに示すように、HttpStatus CodeResultはStatus CodeとStatus Descriptionの2つの読み取り専用の属性を持ち、それぞれ応答状態コードと状態記述情報を表します.構造関数では、状態コードを整数に設定しても良いし、Http Status Codeエニュメレーション形式で状態コードを指定しても良い.
   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: }
HttpStarts CodeResultはExecuteResoult方法における要求応答ロジックを実現するのは簡単であり、下記のコードクリップに示すように、現在のHttpResonseを設定したStuts CodeとStuts Descriptionだけである.もう一つのポイントは、Visual StudioのDevelopment ServerをWebアプリケーションの宿主として採用した場合、HttpStatus CodeResoultのStuts Description属性で設定された状態記述情報は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: }
HttpStatus CodeResultは2つのサブクラスを持ち、応答状態「404,Not Found」に基づくSystem.Web.Mvc.HttpNotFoundResoultと、もう一つは応答状態「401,Not Authored」に基づくSystem.Web.Mvc.HttpUniuthorized 7のResoultを実行します.のフィルタAuthorze Attributeは、ライセンス検証に失敗した場合、HttpUauthorized Resultオブジェクトを返します.
二、Redirect Result
Redirect Resoultは、あるアドレスに対するリダイレクトを実現してくれます.その役割はHttpResonseを呼び出すRedirect/Redirect Permanent方法と完全に一致しています.次のコードの断片に示すように、RedirectResultは2つのリードオンリー属性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: }
一時的なリダイレクトと永久リダイレクトは、それぞれHttpResonseのRedirectとRedirectPermanentを呼び出すことによって実現され得るが、実際にはRedirect Resultがリダイレクトに基づいて実現されるのは、この2つの方法を呼び出すことによって達成されており、これは以下のような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は、リダイレクト先アドレスを示すUrl属性がなくなり、代わりに、ルーティング登録名とルーティングパラメータを示すRouteNameとRouteValues属性がなくなり、リダイレクトする際には、この2つの属性に基づいて、注册のルーティングに基づいて特定のリダイレクトアドレスを解析することになる.
   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では、Redirect/RedirectToRout Rerect/Redirect Permanent方法など、Redirect/Redirect/Redirect/Redirect RedictReltを作成するための一連の方法が定義されています.RedirectToRoute/RedirectToRoutePermanenによって作成されたRedirectRelt/RedirectToRouteResultオブジェクトは、登録されたあるルートの対象です.
四、「302リダイレクト」V.S.「301リダイレクト」
一時的なリダイレクトおよび永久リダイレクトは、時々、「302リダイレクト」および「301リダイレクト」とも呼ばれ、302および301は応答の状態コードを表している.HttpResonseのRedirect/Redirect Permanentメソッドを呼び出すと、対応する応答状態コードを設定するほか、リダイレクトされたターゲットアドレスをレスポンスヘッダに書き込み、応答を受信したブラウザはリダイレクト先アドレスへのアクセスを自動的に開始する.
   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: }
上記コードの断片において、一時的なリダイレクトと永久リダイレクトを採用したアクション方法RedirectとRedirect Permanentを定義しました.ブラウザを通じてそれぞれの訪問を開始すると、次のような内容を持つ2つの応答が得られます.二つのリダイレクトの異なる役割は主に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>
 
RedirectToRouteResult  AS.NET MVCのいくつかのアクションのResoultの本質を理解します。  AS.NET MVCのいくつかのアクションResoultの本質を理解する:FileResoult  AS.NET MVCのいくつかのアクションResoultの本質を理解する:JavaScript Resoult&JsonResoult
作者:
AS.NET MVCのいくつかのアクションのResoultの本質を理解します。
出典:
Atech
この著作権は作者とブログ園に共有されています.転載を歓迎します.しかし、作者の同意なしにこの声明を保留しなければなりません.文章のページの明確な位置で原文の接続を提供します.そうでなければ、法律責任を追及する権利を保留します.
カテゴリ: 
http://artech.cnblogs.com/