【it之家app源码】【win系统上传源码】【hashmapput操作的源码】ws游戏源码_wap游戏源码

时间:2024-11-26 16:29:05 编辑:无限法则源码 来源:web图片提交源码

1.我把程序修改了 不知道怎样在ws程序下重读脚本
2.node-http-proxy 源码解读

ws游戏源码_wap游戏源码

我把程序修改了 不知道怎样在ws程序下重读脚本

       首先,游戏源码p游动态编译实际上只涉及到两个类型:CodeDomProvider以及CompilerParameters他们都位于System.CodeDom.Compiler命名空间。戏源

          

       以下代码可将源码动态编译为一个程序集:

       动态编译

       获得assembly后,游戏源码p游随后我们即可以通过反射获取程序集里面的戏源类型,然后实例化,游戏源码p游调用类型方法

       不过在此之前,戏源it之家app源码我们得构造WS服务的游戏源码p游代理类,使用WCF框架,戏源创建服务代理类,游戏源码p游常见的戏源代理类结构如下:

       所以,我们要动态构造出代理类源码,游戏源码p游应该知道服务的戏源命名空间、服务方法的游戏源码p游Action地址、ReplyAction地址,戏源当然还有服务方法的游戏源码p游win系统上传源码名称,返回类型,参数列表。这里,我们省略掉服务方法的参数列表,构造代理类,实际上就是一个字符串组装的问题,先创建一个类型,hashmapput操作的源码用于保存构造代理类所要用到的参数:

       服务代理类构造参数

       public class WebServiceParamaters

       {

           public string address;

           public string Address

           {

               get { return address; }

               set

               {

                   address = value;

               }

           }

           private string serviceNamespace;

           public string ServiceNamespace

           {

               get { return serviceNamespace; }

               set

               {

                   serviceNamespace = value;

               }

           }

          private string methodAction;

           public string MethodAction

           {

               get { return methodAction; }

               set

               {

                   methodAction = value;

               }

           }

           private string methodReplyAction;

           public string MethodReplyAction

           {

               get { return methodReplyAction; }

               set

               {

                   methodReplyAction = value;

               }

           }

           private string methodName;

           public string MethodName

           {

               get { return methodName; }

               set

               {

                   methodName = value;

               }

           }

           private string returnType;

           public string ReturnType

           {

               get { return returnType; }

               set

               {

                   returnType = value;

               }

           }

       }

        好,现在我们只需要构造出代理类源码,然后动态编译出代理类的程序集,最后通过反射调用服务方法:

       WebServiceProxyCreator

       public class WebServiceProxyCreator

       {

           public Object WebServiceCaller(WebServiceParamaters parameters)

           {

               CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

               CompilerParameters codeParameters = new CompilerParameters();

               codeParameters.GenerateExecutable = false; 

               codeParameters.GenerateInMemory = true; 

               StringBuilder code = new StringBuilder();

               CreateProxyCode(code, parameters);

       codeParameters.ReferencedAssemblies.Add("System.dll"); 

       codeParameters.ReferencedAssemblies.Add("System.ServiceModel.dll"); 

               CompilerResults results = provider.CompileAssemblyFromSource(codeParameters, code.ToString());

               Assembly assembly = null; 

               if (!results.Errors.HasErrors)

               {

                   assembly = results.CompiledAssembly;

               }

               Type clientType = assembly.GetType("RuntimeServiceClient");

              ConstructorInfo ci = clientType.GetConstructor(new Type[] { typeof(Binding), typeof(EndpointAddress) });

               BasicHttpBinding binding = new BasicHttpBinding(); //只演示传统的WebService调用

               EndpointAddress address = new EndpointAddress(parameters.address);

               Object client = ci.Invoke(new object[] { binding, address });

               MethodInfo mi = clientType.GetMethod(parameters.MethodName);

               Object result = mi.Invoke(client, null);

               mi = clientType.GetMethod("Close"); //关闭代理

               mi.Invoke(client, null);

               return result;

          }

           public static void CreateProxyCode(StringBuilder code, WebServiceParamaters parameters)

           {

               code.AppendLine("using System;");

               code.AppendLine("using System.ServiceModel;");

               code.AppendLine("using System.ServiceModel.Channels;");

               code.Append(@"[ServiceContract(");

               if (!String.IsNullOrEmpty(parameters.ServiceNamespace))

               {

                   code.Append("Namespace=\"").Append(parameters.ServiceNamespace).Append("\"");

               }

               code.AppendLine(")]");

               code.AppendLine("public interface IRuntimeService");

               code.AppendLine("{ ");

               code.Append("[OperationContract(");

               if (!String.IsNullOrEmpty(parameters.MethodAction))

               {

                   code.Append("Action=\"").Append(parameters.MethodAction).Append("\"");

                   if (!String.IsNullOrEmpty(parameters.MethodReplyAction))

                   {

                       code.Append(", ");

                   }

               }

               if (!String.IsNullOrEmpty(parameters.MethodReplyAction))

               {

                   code.Append("ReplyAction=\"").Append(parameters.MethodReplyAction).Append("\"");

               }

               code.AppendLine(")]");

               code.Append(parameters.ReturnType).Append(" ");

               code.Append(parameters.MethodName).AppendLine("();");

               code.AppendLine("}");

               code.AppendLine();

               code.AppendLine("public class RuntimeServiceClient : ClientBase<IRuntimeService>, IRuntimeService");

               code.AppendLine("{ ");

               code.AppendLine("public RuntimeServiceClient(Binding binding, EndpointAddress address) :base(binding, address)");

               code.AppendLine("{ ");

               code.AppendLine("}");

               code.Append("public ").Append(parameters.ReturnType).Append(" ");

               code.Append(parameters.MethodName).AppendLine("()");

               code.AppendLine("{ ");

               code.Append("return base.Channel.").Append(parameters.MethodName).AppendLine("();");

               code.AppendLine("}");

               code.AppendLine("}");

           }

       }

       注意,由于代理类使用了WCF框架,所以编译时我们需要添加System.ServiceModel的引用,当然System.dll肯定是mono反编译源码必须的,这里要注意,System.ServiceModel.dll应该保存到应用程序目录,否则动态编译时会引发异常,很简单,在工程引用中添加System.ServiceModel的引用,然后在属性中将拷贝到本地属性设置为true。

         

       到此,源码怎么到补码我们就可以直接通过传入的服务地址、服务方法名称以及相关的命名空间,即可调用服务(尽管我们只能调用无参服务,并且尽管我们也只能调用使用BasicHttpBinding绑定的服务,这些限制的原因是…我懒,好吧,相信只要经过一点改动即可去掉这些限制)。

         

       可惜,我们的程序还很傻:每次调用服务都需要去生成代码、编译、创建代理实例最后再调用,嗯…那就缓存吧:

        

       在WebServiceParameters类中重写GetHashCode方法:

       然后在WebServiceProxyCreator中加入缓存机制:

         public class WebServiceProxyCreator

          {

              private static Dictionary<int, Type> proxyTypeCatch = new Dictionary<int, Type>();

              public Object WebServiceCaller(WebServiceParamaters parameters)

              {

                  int key = parameters.GetHashCode();

                  Type clientType = null;

                  if (proxyTypeCatch.ContainsKey(key))

                 {

                     clientType = proxyTypeCatch[key];

                     Debug.WriteLine("使用缓存");

                 }

                 else

                 {

                     CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

                     CompilerParameters codeParameters = new CompilerParameters();

                     codeParameters.GenerateExecutable = false;

                     codeParameters.GenerateInMemory = true;

                     StringBuilder code = new StringBuilder();

                     CreateProxyCode(code, parameters);

                     codeParameters.ReferencedAssemblies.Add("System.dll");

                     codeParameters.ReferencedAssemblies.Add("System.ServiceModel.dll");

                     CompilerResults results = provider.CompileAssemblyFromSource(codeParameters, code.ToString());

                     Assembly assembly = null;

                     if (!results.Errors.HasErrors)

                     {

                         assembly = results.CompiledAssembly;

                     }

                     clientType = assembly.GetType("RuntimeServiceClient");

                     proxyTypeCatch.Add(key, clientType);

                 }

                 ConstructorInfo ci = clientType.GetConstructor(new Type[] { typeof(Binding), typeof(EndpointAddress) });

                 BasicHttpBinding binding = new BasicHttpBinding(); //只演示传统的WebService调用

                 EndpointAddress address = new EndpointAddress(parameters.address);

                 Object client = ci.Invoke(new object[] { binding, address });

                 MethodInfo mi = clientType.GetMethod(parameters.MethodName);

                 Object result = mi.Invoke(client, null);

                 mi = clientType.GetMethod("Close"); //关闭代理

                 mi.Invoke(client, null);

                 return result;

             }

        }

node-mon.setupOutgoing的实现;其次,stream的实现;最后,查看源码了解web-outgoing模块对代理响应的处理。setRedirectHostRewrite函数的代码实现也在这里。

       在websocket请求中,this.wsPasses任务队列包含四种处理函数:checkMethodAndHeader, XHeaders, stream。stream函数的处理流程同上。

       http-proxy-middleware和nokit-filter-proxy库都使用了node-http-proxy来实现服务器代理功能。http-proxy-middleware库的源码解读可以参考相关文章。nokit-filter-proxy库用于为nokit服务器添加代理功能,它是通过绑定onRequest事件函数来实现请求的拦截和转发的。

       这两篇文章都是在作者整理完proxy设计模式后整理的。由于作者水平有限,文章中可能存在错误或不足之处,欢迎读者批评指正。