反射动态调用webservice以及超时处理

这里主要说明的通过反射动态调用webservice超时问题的处理

在做项目的过程中发现,调用WebService超过100s会报操作超时,在百度,CSDN等等都没有找到解决办法,最后实在没办法跟踪了object对象发现解决办法

加一句代码

   ((System.Web.Services.Protocols.WebClientProtocol)(obj)).Timeout = 1200000;//毫秒

1:动态调用WebService方法

2:解决Invoke调用WebService超时


      public static object InvokeWebService(string url,  string classname, string methodname, object[] args)
      {
            
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling" ;
            
if((classname == null||(classname == ""))
             {
                 classname 
= WebServiceHelper.GetWsClassName(url) ;
             }

            
try
             {
                
//获取WSDL
                 WebClient wc                   = new WebClient();
                 Stream stream                  
= wc.OpenRead(url+"?WSDL");
                 ServiceDescription sd          
= ServiceDescription.Read(stream);
                 ServiceDescriptionImporter sdi 
= new ServiceDescriptionImporter();
                 sdi.AddServiceDescription(sd,
"","");
                 CodeNamespace cn                
= new CodeNamespace(@namespace);
                
                
//生成客户端代理类代码
                 CodeCompileUnit ccu             = new CodeCompileUnit();
                 ccu.Namespaces.Add(cn);
                 sdi.Import(cn ,ccu); 
                 CSharpCodeProvider csc          
= new CSharpCodeProvider();
                 ICodeCompiler icc               
= csc.CreateCompiler();
                
                
//设定编译参数
                 CompilerParameters cplist       = new CompilerParameters();
                 cplist.GenerateExecutable       
= false;
                 cplist.GenerateInMemory         
= true;
                 cplist.ReferencedAssemblies.Add(
"System.dll");
                 cplist.ReferencedAssemblies.Add(
"System.XML.dll");
                 cplist.ReferencedAssemblies.Add(
"System.Web.Services.dll");
                 cplist.ReferencedAssemblies.Add(
"System.Data.dll");

                
//编译代理类
                 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
                
if(true == cr.Errors.HasErrors)
                 {
                     System.Text.StringBuilder sb 
= new System.Text.StringBuilder();
                    
foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                     {
                         sb.Append(ce.ToString());
                         sb.Append(System.Environment.NewLine);
                     }
                    
throw new Exception(sb.ToString());
                 }

                
//生成代理实例,并调用方法
                 System.Reflection.Assembly assembly = cr.CompiledAssembly;
                 Type t 
= assembly.GetType(@namespace+"."+classname,true,true);
                
object obj = Activator.CreateInstance(t);

                 System.Reflection.MethodInfo mi = t.GetMethod(methodname);

                //设置超时时间
                 ((System.Web.Services.Protocols.WebClientProtocol)(obj)).Timeout = 1200000;//毫秒

                 return  mi.Invoke(obj,args);
             }
            
catch (Exception ex)
             {
                
throw   new  Exception(ex.InnerException.Message, new  Exception(ex.InnerException.StackTrace));
             }
         }

        
private   static   string  GetWsClassName( string  wsUrl)
         {
            
string [] parts  =  wsUrl.Split( ' / ' ) ;
            
string [] pps    =  parts[parts.Length - 1 ].Split( ' . ' ) ;

            
return  pps[ 0 ] ;
         }


    

你可能感兴趣的:(反射动态调用webservice以及超时处理)