c# 动态调用wsdl接口
调用?wsdl 的接口,可以在项目中添加服务引用,或者使用动态调用的方式。在开发环境中不能访问到接口地址时,就需要使用动态调用,
动态编译后,使用反射调用接口中的方法,完成接口的调用。
1从目标 URL 下载 WSDL 数据;
2使用 ServiceDescription 创建和格式化 WSDL 文档文件;
3使用 ServiceDescriptionImporter 创建客户端代理类;
4使用 CodeDom 动态创建客户端代理类程序集;
5利用反射调用相关 WebService 方法。
public class WSHelper { /// <summary> /// 输出的dll文件名称 /// </summary> private static string m_OutputDllFilename; /// <summary> /// WebService代理类名称 /// </summary> private static string m_ProxyClassName; /// <summary> /// WebService代理类实例 /// </summary> private static object m_ObjInvoke; /// <summary> /// 接口方法字典 /// </summary> private static Dictionary<EMethod, MethodInfo> m_MethodDic = new Dictionary<EMethod, MethodInfo>(); /// <summary> /// 创建WebService,生成客户端代理程序集文件 /// </summary> /// <param name="error"></param> /// <returns></returns> public static bool CreateWebService(out string error) { try { error = string.Empty; m_OutputDllFilename = ConfigurationManager.AppSettings[""].ToString(); m_ProxyClassName = ConfigurationManager.AppSettings[""].ToString(); string webServiceUrl = ConfigurationManager.AppSettings[""].ToString(); webServiceUrl += "?WSDL"; // 如果程序集已存在,直接使用 if (File.Exists(Path.Combine(Environment.CurrentDirectory, m_OutputDllFilename))) { BuildMethods(); return true; } //使用 WebClient 下载 WSDL 信息。 WebClient web = new WebClient(); Stream stream = web.OpenRead(webServiceUrl); //创建和格式化 WSDL 文档。 if (stream != null) { // 格式化WSDL ServiceDescription description = ServiceDescription.Read(stream); // 创建客户端代理类。 ServiceDescriptionImporter importer = new ServiceDescriptionImporter { ProtocolName = "Soap", Style = ServiceDescriptionImportStyle.Client, CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync }; // 添加 WSDL 文档。 importer.AddServiceDescription(description, null, null); //使用 CodeDom 编译客户端代理类。 CodeNamespace nmspace = new CodeNamespace(); CodeCompileUnit unit = new CodeCompileUnit(); unit.Namespaces.Add(nmspace); ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); CompilerParameters parameter = new CompilerParameters { GenerateExecutable = false, // 指定输出dll文件名。 OutputAssembly = m_OutputDllFilename }; parameter.ReferencedAssemblies.Add("System.dll"); parameter.ReferencedAssemblies.Add("System.XML.dll"); parameter.ReferencedAssemblies.Add("System.Web.Services.dll"); parameter.ReferencedAssemblies.Add("System.Data.dll"); // 编译输出程序集 CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit); // 使用 Reflection 调用 WebService。 if (!result.Errors.HasErrors) { BuildMethods(); return true; } else { error = "反射生成dll文件时异常"; } stream.Close(); stream.Dispose(); } else error = "打开WebServiceUrl失败"; } catch (Exception ex) { error = ex.Message; //Log.WriteLog(error); } return false; } /// <summary> /// 反射构建Methods /// </summary> private static void BuildMethods() { Assembly asm = Assembly.LoadFrom(m_OutputDllFilename); Type[] types = asm.GetTypes(); Type asmType = asm.GetType(m_ProxyClassName); m_ObjInvoke = Activator.CreateInstance(asmType); var methods = Enum.GetNames(typeof(EMethod)).ToList(); foreach (var item in methods) { var methodInfo = asmType.GetMethod(item); if (methodInfo != null) { var method = (EMethod)Enum.Parse(typeof(EMethod), item); m_MethodDic.Add(method, methodInfo); } } } /// <summary> /// 获取请求响应 /// </summary> /// <param name="method"></param> /// <param name="para"></param> /// <returns></returns> public static string GetResponseString(EMethod method, params object[] para) { string result = string.Empty; try { if (m_MethodDic.ContainsKey(method)) { var temp = m_MethodDic[method].Invoke(m_ObjInvoke, para); if (temp != null) result = temp.ToString(); } } catch { } return result; } }
//接口的方法名称
public enum EMethod { method1, method2, method3 }
调用:
string error="";
string param1 = "";
string param2 = "";
string param3 = "";
bool succ = WSHelper.CreateWebService(out error);
string result = WSHelper.GetResponseString(EMethod.method1, param1,param2,param3);

浙公网安备 33010602011771号