厂字形网页布局网站,建设工程合同应当采用,浙江建设网证书查询,专业外贸网站建设 诚信 青岛先学生成#xff0c;再看调用哦 【超细完整版】C# 获取WebService所有方法并调用 【调用篇】 目的 支持通过web url (自适应“?wsdl”的有无) 生成.wsdl文件 和 .dll文件 实现
将通过一个类的三部分来实现这些功能
获取url中的ClassName #xff08;GetClassNameFromUrl再看调用哦 【超细完整版】C# 获取WebService所有方法并调用 【调用篇】 目的 支持通过web url (自适应“?wsdl”的有无) 生成.wsdl文件 和 .dll文件 实现
将通过一个类的三部分来实现这些功能
获取url中的ClassName GetClassNameFromUrl转换为WSDL文件 UrlToWsdlFile转换为DLL文件 UrlToDllFile
创建一个新类 类名为 WebServiceHelper.cs /// summary/// 动态调用WebService支持SaopHeader/// /summarypublic class WebServiceHelper{}并在该类实现下述方法 获取url中的ClassName
#region 获取url中的ClassName
/// summary
/// 获取WebService的类名
/// /summary
/// param namewsUrlWebService地址/param
/// returns返回WebService的类名/returns
public static string GetClassNameFromUrl(string wsUrl)
{string result string.Empty;if (!wsUrl.EndsWith(?wsdl, StringComparison.CurrentCultureIgnoreCase)){wsUrl wsUrl ?wsdl;}XmlDocument doc new XmlDocument();doc.Load(wsUrl);try{result doc.GetElementsByTagName(wsdl:service)[0].Attributes[0].Value;}catch (Exception err){return string.Empty;}return result;
}
#endregion转换为WSDL文件 #region 生成WSDLpublic static void UrlToWsdlFile(string url, string savePath, string outName ){string className string.Empty;string FullFileName string.Empty;className GetClassNameFromUrl(url);if (outName ){outName className .wsdl;}else{if (!outName.EndsWith(.wsdl, StringComparison.CurrentCultureIgnoreCase)){outName outName .wsdl;}}if (!url.EndsWith(?wsdl, StringComparison.CurrentCultureIgnoreCase)){url url ?wsdl;}FullFileName savePath \\ outName;WebClient wc new WebClient();if (!System.IO.Directory.Exists(savePath)){System.IO.Directory.CreateDirectory(savePath);//不存在就创建文件夹}wc.DownloadFile(url, FullFileName);}#endregion转换为DLL文件
#region 生成DLLpublic static CompilerResults UrlToDllFile(string url, string namespace )
{string className string.Empty;className GetClassNameFromUrl(url);if (!url.EndsWith(?wsdl, StringComparison.CurrentCultureIgnoreCase)){url url ?wsdl;}WebClient web new WebClient();Stream stream web.OpenRead(url);//创建和格式化 WSDL 文档。 ServiceDescription description ServiceDescription.Read(stream);CompilerResults compiler CreatDll(className, description, namespace);return compiler;
}private static CompilerResults CreatDll(string className, ServiceDescription description, string namespace )
{try{// 3. 创建客户端代理代理类。ServiceDescriptionImporter importer new ServiceDescriptionImporter();// 指定访问协议。importer.ProtocolName Soap;// 生成客户端代理。importer.Style ServiceDescriptionImportStyle.Client;importer.CodeGenerationOptions CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;// 添加 WSDL 文档。importer.AddServiceDescription(description, null, null);// 4. 使用 CodeDom 编译客户端代理类。// 为代理类添加命名空间缺省为全局空间。CodeNamespace nmspace new CodeNamespace();nmspace.Name namespace;CodeCompileUnit unit new CodeCompileUnit();unit.Namespaces.Add(nmspace);ServiceDescriptionImportWarnings warning importer.Import(nmspace, unit);CodeDomProvider provider CodeDomProvider.CreateProvider(CSharp);CompilerParameters parameter new CompilerParameters();parameter.GenerateExecutable false;parameter.GenerateInMemory true;//在内存中生成输出// 可以指定你所需的任何文件名。parameter.OutputAssembly AppDomain.CurrentDomain.BaseDirectory dll\\ className .dll;parameter.ReferencedAssemblies.Add(System.dll);parameter.ReferencedAssemblies.Add(System.XML.dll);parameter.ReferencedAssemblies.Add(System.Web.Services.dll);parameter.ReferencedAssemblies.Add(System.Data.dll);// 生成dll文件并会把WebService信息写入到dll里面CompilerResults result provider.CompileAssemblyFromDom(parameter, unit);if (result.Errors.HasErrors){System.Text.StringBuilder sb new System.Text.StringBuilder();foreach (System.CodeDom.Compiler.CompilerError ce in result.Errors){sb.Append(ce.ToString());sb.Append(System.Environment.NewLine);}throw new Exception(sb.ToString());}return result;}catch (Exception err){MessageBox.Show(err.Message, Error);return null;}
}
#endregion应用 个人示例实际根据自己需求调整 ; 以下为窗体按钮事件 private void bt_generate_dll_Click(object sender, EventArgs e)
{try{WebServiceHelper.UrlToDllFile(tb_webLink.Text);if (MessageBox.Show(The dll is generated successfully. Do you want to open the file path?, notice, MessageBoxButtons.YesNo) DialogResult.Yes)openPath(dll);}catch (Exception err){MessageBox.Show(err.Message, Error);}
}
private void openPath(string type)
{if (string.IsNullOrEmpty(type)) return;string key string.Empty;key type.Equals(defaultKey) ? wsdlPathKey : dllPathKey;//get Configuration objectConfiguration config ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);//get value by keystring path config.AppSettings.Settings[key].Value;System.Diagnostics.Process.Start(explorer.exe, path);
}
老规矩点赞关注走一波