在工作中经常会遇到不同情况下调用WebServices,本人最也遇上这种情况,在网站找了不少的资料实现了正常的使用,现在代码分享一下:
1、首先在程序头上面 Using 一下:
1 using System.CodeDom.Compiler; 2 using System.Web.Services.Description; 3 using System.CodeDom; 4 using System.Reflection;
2、创建一个打包WebServices dll的方法
1 private bool CreateWebServicesDll() 2 { 3 //获取执行文件当前目录 4 string path = AppDomain.CurrentDomain.BaseDirectory + "MyWebServices.dll"; 5 if (File.Exists(path) == false)//如果不存在就创建file文件夹 6 { 7 File.Delete(path); 8 } 9 try 10 { 11 // 1. 使用 WebClient 下载 WSDL 信息。 12 WebClient web = new WebClient(); 13 Stream stream = web.OpenRead("http://192.168.100.101:8090/PrintService/MaterialService.asmx?wsdl"); 14 // 2. 创建和格式化 WSDL 文档。 15 ServiceDescription description = ServiceDescription.Read(stream); 16 // 3. 创建客户端代理代理类。 17 ServiceDescriptionImporter importer = new ServiceDescriptionImporter(); 18 importer.ProtocolName = "Soap"; // 指定访问协议。 19 importer.Style = ServiceDescriptionImportStyle.Client; // 生成客户端代理。 20 importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; 21 22 importer.AddServiceDescription(description, null, null); // 添加 WSDL 文档。 23 24 // 4. 使用 CodeDom 编译客户端代理类。 25 CodeNamespace nmspace = new CodeNamespace(); // 为代理类添加命名空间,缺省为全局空间。 26 CodeCompileUnit unit = new CodeCompileUnit(); 27 unit.Namespaces.Add(nmspace); 28 29 ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); 30 CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 31 32 CompilerParameters parameter = new CompilerParameters(); 33 parameter.GenerateExecutable = false; 34 parameter.OutputAssembly = "MyWebServices.dll"; // 指定你所需的任何文件名。 35 parameter.ReferencedAssemblies.Add("System.dll"); 36 parameter.ReferencedAssemblies.Add("System.XML.dll"); 37 parameter.ReferencedAssemblies.Add("System.Web.Services.dll"); 38 parameter.ReferencedAssemblies.Add("System.Data.dll"); 39 40 CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit); 41 if (result.Errors.HasErrors) 42 { 43 // 显示编译错误信息 44 return false; 45 } 46 47 } 48 catch(Exception ex) 49 { 50 return false; 51 } 52 53 return true; 54 }
需要注意代码中的 MyWebServices.dll 这个文件是我们想要生成的dll文件名称,可以自定议,Url地址需要在WebServices的地址结束后面加上?WSDL
3.利用反射进行调用
1 public string CallWebservices() 2 { 3 //当前Exc文件的目录 4 string path = AppDomain.CurrentDomain.BaseDirectory + "MyWebServices.dll"; 5 if (Directory.Exists(path) == false)//如果不存在就创建file文件夹 6 { 7 CreateWebServicesDll(); 8 } 9 10 Assembly asm = null; 11 Type t = null; 12 13 asm = Assembly.LoadFrom("MyWebServices.dll"); 14 t = asm.GetType("MaterialSupplierService"); 15 16 object o = Activator.CreateInstance(t); 17 MethodInfo method = t.GetMethod("GeSnIdListByBigBox"); //WebServices中需要调用的方法名 18 object[] args = new object[] { "B1900420193" }; //WebServices中需要传的参数 19 string result = method.Invoke(o, args) as String; 20 21 return result; 22 }