C#动态调用WebService
上代码
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web.Services.Description;
namespace Jerry_Libr_Framework.WebServiceOperator
{
public class CreateWebServiceDLL
{
public readonly string Url;
public CreateWebServiceDLL(string url)
{
Url = url;
}
//动态调用WebService的方法
//1. 从目标url下载wsdl数据
//2. 使用ServiceDescription创建和格式化WSDL文档文件
//3. 使用ServiceDescriptionImporter动态创建客户端代理类
//4. 使用CodeDom动态创建代理类程序集
//5. 利用反射调用相关WebService的方法
/***************************代码实现*************************************************************/
public void CreateDLLFromUrl()
{
//1. 从目标url下载wsdl数据
WebClient webClient = new WebClient();
HttpWebRequest.DefaultWebProxy = new WebProxy($"{Url}:80", true);
Stream stream = webClient.OpenRead($"{Url}?WSDL");
//2. 使用ServiceDescription创建和格式化WSDL文档文件
ServiceDescription serviceDescription = ServiceDescription.Read(stream);
//3. 使用ServiceDescriptionImporter动态创建客户端代理类
ServiceDescriptionImporter descriptionImporter = new ServiceDescriptionImporter();
descriptionImporter.ProtocolName = "SOAP";//设置访问协议
descriptionImporter.Style = ServiceDescriptionImportStyle.Client;//表示生成客户端代理类
descriptionImporter.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties | System.Xml.Serialization.CodeGenerationOptions.GenerateNewAsync;//标准和异步
descriptionImporter.AddServiceDescription(serviceDescription, null, null);
//4. 使用CodeDom动态创建代理类程序集
CodeNamespace codeNamespace = new CodeNamespace("Jerry_Libr_Framework.WebServiceOperator");//指定名称空间,默认为全局名称空间
CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
codeCompileUnit.Namespaces.Add(codeNamespace);
ServiceDescriptionImportWarnings warnings = descriptionImporter.Import(codeNamespace, codeCompileUnit);
CodeDomProvider codeDomProvider = CodeDomProvider.CreateProvider("CSharp");//使用C#
CompilerParameters compilerParameters = new CompilerParameters();
compilerParameters.GenerateExecutable = false;//不生成可执行文件
//compilerParameters.GenerateInMemory = true;
compilerParameters.OutputAssembly = "SfisWebService.dll";
compilerParameters.ReferencedAssemblies.Add("System.dll");
compilerParameters.ReferencedAssemblies.Add("System.XML.dll");
compilerParameters.ReferencedAssemblies.Add("System.Web.Services.dll");
compilerParameters.ReferencedAssemblies.Add("System.Data.dll");
CompilerResults results= codeDomProvider.CompileAssemblyFromDom(compilerParameters, codeCompileUnit);
//5. 利用反射调用相关WebService的方法
if (!results.Errors.HasErrors)
{
Assembly assembly =Assembly.LoadFrom("SfisWebService.dll");
Type type = assembly.GetType("Jerry_Libr_Framework.WebServiceOperator.SFISTSPWebService");
object o = Activator.CreateInstance(type);
foreach (MethodInfo m in type.GetMethods())
{
if (m.IsPublic)
{
Console.WriteLine(m.Name);
}
}
//Console.WriteLine(type.GetMethod("GetDatabaseInformation").Invoke(o, null));
}
}
}
}