liuwenjun830

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 
代码
namespace DynamicCallWebService
{
    
public class WebServiceCaller
    {
        
public static object InvokeWebService(string url, string methodName, object[] args)
        {
            
return InvokeWebService(url, null, methodName, args);
        }
        
public static object InvokeWebService(string url, string className, string methodName, object[] args)
        {
            
string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
            
if (string.IsNullOrEmpty(className))
            {
                className 
= GetWsClassName(url);
            }
            
try
            {
                
//Get WSDL
                string wsdlUrl = url + "?WSDL";
                WebClient webClient 
= new WebClient();
                Stream stream 
= webClient.OpenRead(wsdlUrl);
                ServiceDescription sd 
= ServiceDescription.Read(stream);
                
if (!string.IsNullOrEmpty(sd.Name) && sd.Name != className)
                    className 
= sd.Name;
                ServiceDescriptionImporter sdi 
= new ServiceDescriptionImporter();
                sdi.AddServiceDescription(sd, 
"""");

                
                
// Add any child namespaces First
                foreach (Import schemaImport in sd.Imports)
                {
                    Uri baseUri 
= new Uri(wsdlUrl);
                    
string schemaLocation = schemaImport.Location;
                    
if (schemaLocation == null)
                        
continue;
                    Uri schemaUri 
= new Uri(baseUri, schemaLocation);

                    
using (Stream schemaStream = webClient.OpenRead(schemaUri))
                    {
                        
try
                        {
                            ServiceDescription sdImport 
= ServiceDescription.Read(schemaStream, true);
                            sdImport.Namespaces.Add(
"wsdl", schemaImport.Namespace);
                            sdi.AddServiceDescription(sdImport, 
nullnull);
                        }
                        
catch { }  // ignore schema import errors
                    }
                }

                
// Download and inject any imported schemas (ie. WCF generated WSDL)            
                foreach (XmlSchema wsdlSchema in sd.Types.Schemas)
                {
                    
// Loop through all detected imports in the main schema
                    foreach (XmlSchemaObject externalSchema in wsdlSchema.Includes)
                    {
                        
// Read each external schema into a schema object and add to importer
                        if (externalSchema is XmlSchemaImport)
                        {
                            Uri baseUri 
= new Uri(wsdlUrl);
                            
string exSchemaLocation = ((XmlSchemaExternal)externalSchema).SchemaLocation;
                            
if (string.IsNullOrEmpty(exSchemaLocation))
                                
continue;

                            Uri schemaUri 
= new Uri(baseUri, exSchemaLocation);

                            
using (Stream schemaStream = webClient.OpenRead(schemaUri))
                            {
                                
try
                                {
                                    System.Xml.Schema.XmlSchema schema 
= XmlSchema.Read(schemaStream, null);
                                    sdi.Schemas.Add(schema);
                                }
                                
catch { }  // ignore schema import errors                                                        
                            }
                        }
                    }
                }

                CodeNamespace cn 
= new CodeNamespace(@namespace);
                
//Create Client proxy class
                CodeCompileUnit ccu = new CodeCompileUnit();
                ccu.Namespaces.Add(cn);
                sdi.Import(cn, ccu);
                CSharpCodeProvider csc 
= new CSharpCodeProvider();
                ICodeCompiler icc 
= csc.CreateCompiler();
                
//Set complier parameters
                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");
                
//complie proxy class
                CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
                
if (true == cr.Errors.HasErrors)
                {
                    StringBuilder sb 
= new StringBuilder();
                    
foreach (CompilerError ce in cr.Errors)
                    {
                        sb.Append(ce.ToString());
                        sb.Append(Environment.NewLine);
                    }
                    
throw new Exception(sb.ToString());
                }
                
//Generate proxy instance and invoke mehtod
                Assembly assembly = cr.CompiledAssembly;
                Type t 
= assembly.GetType(@namespace + "." + className, truetrue);
                
object obj = Activator.CreateInstance(t);
                MethodInfo method 
= t.GetMethod(methodName);
                
return method.Invoke(obj, args);
            }
            
catch (Exception ex)
            {
                
throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
            }
        }

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


posted on 2010-11-05 10:46  偷回忆的人  阅读(1022)  评论(0编辑  收藏  举报