<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      返回到目錄:曬曬我的Ajax服務端框架

      我的Ajax服務端框架 - 安全問題

      通過前面章節的示例代碼,您會發現一個問題:那就是在JS中可以調用所有的C#的方法(理論上是可以調用任何一個程序集中的所有Public類的所有方法)。如果您認為這樣做,有安全問題,那么可以訂閱事件 OnAjaxCall 來過濾請求。FishWebLib提供的Handler或者Module都有這個事件,您可以統一處理。可參考以下代碼:

      // Ajax調用的安全檢查事件。
      FishWebLib.Ajax.AjaxMethodV2Handler.OnAjaxCall += new FishWebLib.Ajax.AjaxCallCheckHandler(AjaxMethodV2Handler_OnAjaxCall);
      
      /// <summary>
      /// Ajax調用檢查
      /// </summary>
      /// <param name="e"></param>
      static void AjaxMethodV2Handler_OnAjaxCall(FishWebLib.Ajax.AjaxCallEventArgs e)
      {
          // ##################################################################################################
          // 在這里可以做一些在Ajax調用時的安全檢查。
          // ##################################################################################################
      
          
          // 如果經過您的檢查邏輯,不允許一個調用請求,可以做如下處理:
          //e.IsAllowed = false;
          //e.DenyMessage = "請求的資源不允許訪問。";
      
      
          // 在本示例中,就不處理了。因為在另一個地方,我仍然有機會處理。
      }
      

      AjaxCallEventArgs的定義請見后文。

      AjaxMethodV1Handler的安全檢查示例

      // Ajax調用的安全檢查事件。
      FishWebLib.Ajax.AjaxMethodV1Handler.OnAjaxCall += new FishWebLib.Ajax.AjaxCallCheckHandler(AjaxMethodV1Handler_OnAjaxCall);
      
      static void AjaxMethodV1Handler_OnAjaxCall(FishWebLib.Ajax.AjaxCallEventArgs e)
      {
          string fileName = System.IO.Path.GetFileNameWithoutExtension(e.context.Request.PhysicalPath);
      
          // 在這里,我將只檢查要調用的類名是不是以Ajax開頭,如果不是,則不允許調用。
          if( fileName.StartsWith("Ajax", StringComparison.OrdinalIgnoreCase) == false ) {
              e.IsAllowed = false;
              e.DenyMessage = "不允許調用指定的類方法。";
          }
      
          // 要調用的方法名中URL的查詢字符串中,也可以檢查到。這里就不檢查了。
      }
      

      UserControlHandler 和 PageMethodModule 也有 OnAjaxCall 事件,可以按上面的方式來類似處理。

      您也可以定義一個統一的安全檢查方法,只要符合下面的委托定義即可:

      
      namespace FishWebLib.Ajax
      {
          /// <summary>
          /// AJAX調用發生時的委托類型
          /// </summary>
          /// <param name="e">AjaxCallEventArgs類型的事件參數</param>
          public delegate void AjaxCallCheckHandler(AjaxCallEventArgs e);
      
      
          /// <summary>
          /// 發生AJAX調用時的事件參數
          /// </summary>
          public sealed class AjaxCallEventArgs : System.EventArgs
          {
              /// <summary>
              /// 本次請求的HttpContext實例
              /// </summary>
              public HttpContext context;
              /// <summary>
              /// 調用類型
              /// </summary>
              public AjaxCallType AjaxCallType;
      
              /// <summary>
              /// 調用是否允許
              /// </summary>
              public bool IsAllowed = true;
      
              /// <summary>
              /// 當設置IsAllowed=false時,可為本成員設置一個用于表示禁止訪問的消息。
              /// </summary>
              public string DenyMessage;
      
              /// <summary>
              /// 構造方法
              /// </summary>
              /// <param name="cxt">HttpContext對象</param>
              /// <param name="type">Ajax調用類型</param>
              public AjaxCallEventArgs(HttpContext cxt, AjaxCallType type)
              {
                  this.context = cxt;
                  this.AjaxCallType = type;
              }
      
          }
      
      
          /// <summary>
          /// AJAX調用類型
          /// </summary>
          public enum AjaxCallType
          {
              /// <summary>
              /// 調用C#方法,由AjaxMethodV1Handler引發
              /// </summary>
              AjaxMethodV1,
              /// <summary>
              /// 調用用戶控件,由UserControlHandler引發
              /// </summary>
              UserControl,
              /// <summary>
              /// 調用頁面方法,由PageMethodModule引發
              /// </summary>
              PageMethod,
              /// <summary>
              /// 調用C#方法,由AjaxMethodV2Handler引發
              /// </summary>
              AjaxMethodV2
          }
      
      }
      
      

      如果上面的處理方式仍不能滿足要求,那么請創建自己的ashx處理器,實現您自定義的過濾檢查,然后調用FishWebLib.Ajax.MethodExecutor中的以下方法:

      public static void ProcessRequest(HttpContext context, Type type, string method)
      

      我的Ajax服務端框架 - 初始化設置

      請參考以下代碼:(在演示程序的AppHelper.cs中可以找到)

      AjaxMethodV2Handler的初始化設置

      /// <summary>
      /// 設置AjaxMethodV2Handler查找類型時的工作方式。
      /// </summary>
      static void SetAjaxClassSearchMode()
      {
          // 這里先說明一下:
          // 當AjaxMethodV2Handler被Asp.net調用時,需要知道要調用哪個類型的哪個方法。
          // 在AjaxMethodV2Handler的默認實現中,調用了AjaxClassSearchHelper.Parse,
          //    這個方法分析URL,并根據指定的類型查找模式,去查找指定的類型,并獲取一個方法名稱。
      
          // ##################################################################################################
          // 這里,我們有二種選擇:
          // ##################################################################################################
      
          // 1. 自己實現一個 ParseTypeMethodPairFromRequest 的委托并賦值給AjaxMethodV2Handler.ParseFunc,這樣做有二個好處:
          //     a. 可以實現自己認為更方便的URL,比如URL:/Classname/MethodName.ext
          //     b. 可以檢查指定的類型是否允許被Ajax調用。(###安全檢查###)
      
          // 2. 保持默認的設置,但需要簡單的2個配置AjaxClassSearchHelper。
          //FishWebLib.Ajax.AjaxClassSearchHelper.Placeholder = ;    // 這個參數這里就不設置了,保持默認值。
      
          FishWebLib.Ajax.AjaxClassSearchHelper.ClassNameSearchPattern = new string[] { 
              // 建議將全部供Ajax調用的類,放在一個命名空間下,這樣也可以保證在客戶端的JS不至于可以調用所有的類型
              // 還可以像Asp.net MVC那樣,為所有允許Ajax調用的類,取一個后綴,或者前綴也是可行的。
              typeof(MyLab.AjaxService.AjaxOrder).AssemblyQualifiedName.Replace("AjaxOrder", "{0}")
          };
      
          // #############################################################################################3
      
          // 在本網站中,我們選擇第一種方法,但為了方便,我將仍借助于第二種方法來簡化實現。
          FishWebLib.Ajax.AjaxMethodV2Handler.ParseFunc = MyParseTypeMethodPairFromRequest;
      }
      
      /// <summary>
      /// 根據當前請求獲取要調用的類型及方法名
      /// </summary>
      /// <param name="context"></param>
      /// <returns></returns>
      static FishWebLib.Ajax.TypeMethodPair MyParseTypeMethodPairFromRequest(HttpContext context)
      {
          // 使用FishWebLib提供的方法,簡化實現。
          FishWebLib.Ajax.TypeMethodPair result = FishWebLib.Ajax.AjaxClassSearchHelper.Parse(context);
          if( result != null ) {
              // 在這里,我還可以檢查將要調用的類型和方法是否是允許的。
      
              // 這里的規則很簡單:如果不是Ajax開頭的類型,將不允許訪問
              if( result.Type.Name.StartsWith("Ajax") == false ) {
      
                  // 轉向另一個方法的調用,或者返回 null 也是表示禁止訪問。
                  result = new FishWebLib.Ajax.TypeMethodPair(typeof(AppHelper), "DenyAjaxAccess");
              }
          }
          return result;
      }
      
      /// <summary>
      /// 禁止Ajax訪問時要調用的方法
      /// </summary>
      /// <returns></returns>
      public static string DenyAjaxAccess()
      {
          return "請求的資源不允許訪問。";
      }
      
      

      AjaxMethodV1Handler的初始化設置

      // 注意:下面的配置指定AjaxMethodV1Handler查找類型的程序集范圍。
      FishWebLib.Ajax.AjaxMethodV1Handler.AjaxAssemblyName = typeof(AjaxTestClass).Assembly.ToString();
      

      統一的異常處理

      // 設置Ajax 調用時的異常事件,處理異常。
      FishWebLib.Ajax.AjaxExceptionHelper.OnAjaxInvokeException += 
      			new FishWebLib.Ajax.AjaxExceptionAction(AjaxExceptionHelper_OnAjaxInvokeException);
      
      /// <summary>
      /// Ajax異常處理
      /// </summary>
      /// <param name="e"></param>
      static void AjaxExceptionHelper_OnAjaxInvokeException(FishWebLib.Ajax.AjaxExceptionEventArgs e)
      {
          // 指示異常已經過處理
          e.ExceptionHandled = true;
      
          // 異常的處理方式也很簡單:把異常寫入到響應流,并保存異常。
      
          e.context.Response.Write(e.Exception.GetBaseException().Message);
      
          SafeLogException(e.Exception);
      }
      

      我的Ajax服務端框架 - 實現原理

      本文將分別介紹FishWebLib提供的三個Handler及一個Module的實現原理。

      1. AjaxMethodV1Handler

      AjaxMethodV1Handler的主要實現代碼如下:

      public void ProcessRequest(HttpContext context)
      {
          if( string.IsNullOrEmpty(AjaxAssemblyName) ) {
              AjaxCallChecker.WriteSimpleMessage(context, SR.AjaxAssemblyNameIsNull);
              return;
          }
      
          if( AjaxCallChecker.RaiseCheckEvent(context, OnAjaxCall, AjaxCallType.AjaxMethodV1) == false ) 
              return;
          
      
          string className = System.IO.Path.GetFileNameWithoutExtension(context.Request.PhysicalPath);
          Type type = TypeManager.GetTypeByName(string.Concat(className, ", ", AjaxAssemblyName));
      
          if( type == null ) {
              AjaxExceptionHelper.ProcessException(context, new Exception(string.Format(SR.TypeNotFound, className)));
              return;
          }
      
          MethodExecutor.ProcessRequest(context, type);
      }
      

      從以上代碼可以看出,處理器非常簡單:根據要請求的文件名,去掉擴展名,當成類名,然后與參數AjaxAssemblyName合并,得到一個類名的完全限定形式, 最后獲取要調用類的具體類型,然后把請求交給MethodExecutor.ProcessRequest()來處理,在那里將會從URL的查詢字符串中讀取參數method, 就可以得到要調用的方法名。有了類型與方法名后,就可以唯一確定一個方法了,最后只需要去調用就可以了。

      至于如何調用方法,如何給方法的參數賦值,最后如何處理返回值給客戶端,就屬于框架本身的事情了。
      所有的這一切,對于客戶端來說,更是透明的。這些透明的實現也就是框架的意義了。

      2. AjaxMethodV2Handler

      AjaxMethodV2Handler的主要實現代碼如下:

      private static ParseTypeMethodPairFromRequest s_ParseFunc = AjaxClassSearchHelper.Parse;
      
      public void ProcessRequest(HttpContext context)
      {
          if( AjaxCallChecker.RaiseCheckEvent(context, OnAjaxCall, AjaxCallType.AjaxMethodV2) == false )
              return;
      
          TypeMethodPair pair = s_ParseFunc(context);
          if( pair == null ) {
              AjaxExceptionHelper.ProcessException(context, new Exception(SR.InvalidRequest));
              return;
          }
          
          MethodExecutor.ProcessRequest(context, pair.Type, pair.Method);
      }
      

      如果比較AjaxMethodV1Handler的實現,可以發現,AjaxMethodV2Handler更簡單。最終也是把請求交給MethodExecutor.ProcessRequest()來處理。 其實,這二個處理器與PageMethodModule的實現是比較類似的:獲取一個類型和一個方法名,扔給MethodExecutor就完事了。

      只是AjaxMethodV2Handler把“獲取類型和方法名”的過程交給委托的實現來處理了。
      默認的實現使用了:AjaxClassSearchHelper.Parse ,它能拆分這種形式的URL: class.method.xx
      AjaxClassSearchHelper定義了二個數據成員:

      /// <summary>
      /// 在URL中用于分隔類名和方法名的特殊字符,默認值:'.'
      /// </summary>
      public static char Placeholder = '.';
      
      /// <summary>
      /// 用于搜索類類型的搜索模式字符串數組。搜索模式通常是一個類型的完全限定字符串中將類名改成{0}
      /// </summary>
      public static string[] ClassNameSearchPattern = null;
      

      可以這樣設置ClassNameSearchPattern:

      FishWebLib.Ajax.AjaxClassSearchHelper.ClassNameSearchPattern = new string[] { 
          typeof(MyLab.AjaxService.AjaxOrder).AssemblyQualifiedName.Replace("AjaxOrder", "{0}")
      };
      

      3. UserControlHandler

      UserControlHandler的主要實現代碼如下:

      public void ProcessRequest(HttpContext context)
      {
          if( AjaxCallChecker.RaiseCheckEvent(context, OnAjaxCall, AjaxCallType.UserControl) == false )
              return;
      
          string filePath = context.Request.AppRelativeCurrentExecutionFilePath;
          // 這里不檢查指定的用戶控件是否存在,如果不存在Asp.net會告訴調用方的。
          
          UcExecutor.ProcessRequest(context, filePath, true);
      }
      

      從代碼可以看出:請求最后是由UcExecutor來處理的。
      所以,也可以不使用這個處理器,而是將請求交給C#方法來處理,獲取數據后,再去調用UcExecutor.ProcessRequest(),這種做法是符合MVC的設計思想的。

      4. PageMethodModule

      PageMethodModule的實現與前二個處理器類似,不一樣的地方在于它是以Module的形式存在的。
      為了能夠調用MethodExecutor.ProcessRequest(),它也需要知道一個類型和一個方法名。 有了請求頁面地址,就可以知道當前在請求哪個頁面,自然也就能獲取一個類型了,方法名可以通過從FORM中獲取, PageMethodModule會嘗試讀取FORM中鍵名為"AjaxPageMethod"對應的值,如果找到,后面的事情就如前面所說的那樣處理了。
      當然,為了性能,PageMethodModule只會處理POST請求。如果沒有從FROM找到方法名,也會忽略本次請求。

      返回到目錄:曬曬我的Ajax服務端框架

      點擊此處進入示例展示及下載頁面

      posted on 2011-05-02 13:42  Fish Li  閱讀(6072)  評論(12)    收藏  舉報
      主站蜘蛛池模板: 亚洲色拍拍噜噜噜最新网站| 国产不卡一区二区精品| 在线观看潮喷失禁大喷水无码| 亚洲免费网站观看视频| 9久9久热精品视频在线观看| 久热这里有精彩视频免费| 精品无码一区在线观看| 乱色欧美激惰| 晋宁县| 在线观看精品日本一区二| 老妇肥熟凸凹丰满刺激| 亚洲综合一区无码精品| 国产精品一区二区在线欢| 国产成人精品视频不卡| 亚洲狠狠爱一区二区三区| 丁香花成人电影| 国产精品护士| 免费费很色大片欧一二区| 日本久久高清一区二区三区毛片 | 亚洲精品无码高潮喷水A| 欧美牲交40_50a欧美牲交aⅴ| 一区二区三区四区高清自拍| 无码人妻精品一区二区三区下载| 99国产欧美另类久久久精品| 亚洲高清WWW色好看美女| 青春草公开在线视频日韩| 最近中文字幕完整版hd| 性男女做视频观看网站| 欧美成人精品三级网站视频| 免费无码又爽又刺激成人| 在线aⅴ亚洲中文字幕| 久久精品国产99国产精品严洲| 精品国产欧美一区二区三区在线| 精品在线观看视频二区| 狠狠综合久久综合88亚洲| 亚洲av日韩av永久无码电影| 国产亚洲一区二区三区四区| 亚洲免费成人av一区| 亚洲天天堂天堂激情性色| 广东少妇大战黑人34厘米视频| 乱60一70归性欧老妇|