zoukankan      html  css  js  c++  java
  • 【原创】cs+html+js+css模式(三):RemoteCallHandler详解

    1.         回顾

    上一篇文章,将webconfig中的设置介绍了下,为我们在获取数据处理的时候,打好了扎实的基础,现在我们我们来详细讲讲“RemoteCallHandler”这个类。

    2.         介绍

    RemoteCallHandler类,是我们在webconfig中定义了,当Post访问。Xyz后缀的文件时,网站程序自己调用的,前面也说过,此类继承了两个类一个是IHttpHandler,一个是IRequiresSessionState;

    IRequiresSessionState类:

    指定目标 HTTP 处理程序需要对会话状态值具有读写访问权。这是一个标记接口,没有任何方法。在自定义 HTTP 处理程序中实现 IRequiresSessionState 接口,以确定处理程序是否需要对会话状态值具有读写访问权。

    IHttpHandler类:

           定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。可以用任何符合公共语言规范 (CLS) 的语言编写自定义 HTTP 处理程序来处理特定的、预定义类型的 HTTP 请求。响应这些特定请求的是在 HttpHandler 类中定义的可执行代码,而不是常规的 ASP 或 ASP.NET网页。HTTP 处理程序向您提供一种方法,使您可以与 IIS Web 服务器的低级别的请求和响应服务交互,同时提供极其类似于 ISAPI 扩展但编程模型较为简单的功能。如果您的处理程序将访问会话状态值,它必须实现 IRequiresSessionState 接口(不包含任何方法的标记接口)。

    从MSDN介绍可得到,我们在自定义IHttpHandler的时候必须要继承这两个类,为什么要使用此类,因为我们要获取网站请求的数据,然后根据捕获访问的数据,对数据进行相关的调用与设置。

    3.         RemoteCallHandler类详细

    1.      using System;

    2.      using System.Reflection;

    3.      using System.Web;

    4.      using System.Web.SessionState;

    5.       

    6.      namespace Better.Web

    7.      {

    8.      //此处继承IhttpHandler与IRequiresSessionState

    9.      public class RemoteCallHandler : IHttpHandler, IRequiresSessionState

    10.   {

    11.    

    12.   #region IHttpHandler 成员

    13.   //实现IhttpHandler里面的IsResuable属性

    14.   public bool IsReusable { get { return false; } }

    15.    

    16.   //实现IHttpHandler中的ProcessRequest方法

    17.   public void ProcessRequest(HttpContext context)

    18.   {

    19.   //获取当前请求对象

    20.   HttpRequest request = context.Request;

    21.   //获取当前发送对象

    22.   HttpResponse response = context.Response;

    23.   //获取请求的头

    24.   string invokeType = request.Headers["RemoteInvoke"];

    25.   //如果请求的头位空,直接抛出异常

    26.   if (string.IsNullOrEmpty(invokeType)) { throw new MissingInvokeTypeException(); }

    27.   //判断当前的指定头的值是否是正确的

    28.   if (invokeType.Equals("MethodInvoke"))

    29.   {

    30.        try

    31.        {

    32.            //如果请求符合,运行的方法,打印在页面上

    33.            response.Write(MethodInvoke(request));

    34.        }

    35.        catch (Exception ex)

    36.        {

    37.             /*当报错时,处理的信息,将信息构造成json格式*/

    38.             string message = (ex.InnerException == null ? ex.Message : ex.InnerException.Message);

    39.             response.StatusCode = 500;

    40.             response.Write("{");

    41.             response.Write(string.Format("\"code\":{0},\"message\":\"{1}\"", 500, message));

    42.            response.Write("}");

    43.         }

    44.         finally

    45.        {

    46.              try

    47.             {

    48.                   response.End();

    49.             }

    50.             catch { }

    51.         }

    52.   }

    53.   }

    54.   #endregion

    55.   //真实的处理函数

    56.   private string MethodInvoke(HttpRequest request)

    57.   {

    58.   /*判断请求是否为空*/

    59.   if (request == null) { throw new ArgumentNullException("request"); }

    60.   /*获取反射对象,判断request.Headers["Assembly"]是否为null 如果为null直接返回空字符串*/

    61.   string assembly = request.Headers["Assembly"] ?? "";

    62.   /*获取操作类型*/

    63.   string typeName = request.Headers["TargetType"];

    64.   /*获取要调用的后台函数名*/

    65.   string methodName = request.Headers["CallingMethod"];

    66.   /*判断操作类型名是否为空*/

    67.   if (string.IsNullOrEmpty(typeName)) { throw new MissingCallingTypeException(); }

    68.   /*判断调用的后台函数名是否为空*/

    69.   if (string.IsNullOrEmpty(methodName)) { throw new MissingCallingMethodException(); }

     

    70.   /* 获取远程调用的目标类型。*/

    71.   Type type = Type.GetType(typeName + (string.IsNullOrEmpty(assembly) ? "" : "," + assembly));

    72.   if (type != null)

    73.   {

    74.   /* 获取远程调用的目标方法。*/

    75.   MethodInfo mi = type.GetMethod(methodName);

    76.   if (mi != null)

    77.   {

    78.   /* 获取调用参数。*/

    79.   object[] arguments = null;

    80.   ParameterInfo[] pis = mi.GetParameters();

    81.   if (pis.Length > 0)

    82.   {

    83.           arguments = new object[pis.Length];

    84.           for (int i = 0; i < pis.Length; i++)

    85.          {

    86.             arguments[i] = Convert.ChangeType(request.Form[i], pis[i].ParameterType);

    87.          }

    88.   }

    89.   /* 判断调用的方法是否静态方法。

    l        如果是静态方法,则方法调用不需创建类实例。*/

    90.   object inst = mi.IsStatic ? null : Activator.CreateInstance(type, true);

    91.   if (mi.ReturnType.Name == "Void")

    92.   {

    93.           mi.Invoke(null, arguments);

    94.           return "";

    95.   }

    96.   else

    97.   {

    98.           return mi.Invoke(null, arguments).ToString();

    99.   }

    100.}

    101.throw new GetMethodFailedException(typeName, methodName);

    102.}

    103.throw new GetTypeFailedException(typeName);

    104.}

    105.}

     

    106./// <summary>

    107./// 远程调用缺少调用类型时引发的异常。

    108./// </summary>

    109.[Serializable]

    110.public class MissingInvokeTypeException : Exception

    111.{

    112.       public MissingInvokeTypeException() : base("缺少调用类型。") { }

    113.}

     

    114./// <summary>

    115./// 远程调用缺少目标类型时引发的异常

    116./// </summary>

    117.[Serializable]

    118.public class MissingCallingTypeException : Exception

    119.{

    120.       public MissingCallingTypeException() : base("远程调用缺少目标类型。") { }

    121.}

     

    122./// <summary>

    123./// 远程调用缺少目标方法时引发的异常

    124./// </summary>

    125.[Serializable]

    126.public class MissingCallingMethodException : Exception

    127.{

    128.        public MissingCallingMethodException() : base("远程调用缺少目标方法。") { }

    129.}

     

    130./// <summary>

    131./// 远程调用加载类型失败时引发的异常。

    132./// </summary>

    133.[Serializable]

    134.public class GetTypeFailedException : Exception

    135.{

    136.       public GetTypeFailedException() : base("加载类型失败。") { }

    137.       public GetTypeFailedException(string typeName) : base(string.Format("加载类型 \"{0}\" 失败。", typeName)) { }

    138.}

     

    139./// <summary>

    140./// 远程调用获取目标方法失败时引发的异常。

    141./// </summary>

    142.[Serializable]

    143.public class GetMethodFailedException : Exception

    144.{

    145.           public GetMethodFailedException() : base("获取方法失败。") { }

    146.           public GetMethodFailedException(string methodName) : base(string.Format("获取 \"{0}\" 方法失败。", methodName)) { }

    147.           public GetMethodFailedException(string typeName, string methodName) : base(string.Format("获取类型 \"{0}\" 的 \"{1}\" 方法失败。", typeName, methodName)) { }

    148.}

     

    149./// <summary>

    150./// 远程调用失败时引发的异常。

    151./// </summary>

    152.[Serializable]

    153.public class RemoteInvokeFailedException : Exception

    154.{

    155.     public RemoteInvokeFailedException() : base("远程调用失败。") { }

    156.     public RemoteInvokeFailedException(string typeName, string methodName) : base(string.Format("远程调用方法 \"{0}.{1}\" 失败。", typeName, methodName)) { }

    157.}

    158.}

  • 相关阅读:
    Flask 中的路由系统
    Flask 中内置的 Session
    Flask中的模板语言jinja2
    Flask 中的 5种返回值
    Redis快速入门
    动态实现前后台分页、翻页按钮、上一页、下一页、首页、末页
    bus.js非父子组件之间通讯
    vue中父子组件之间相互传值
    js实现加减乘除
    禁用微信分享
  • 原文地址:https://www.cnblogs.com/NoRoad/p/1652406.html
Copyright © 2011-2022 走看看