首页 > 编程知识 正文

c/c++下载,英语音标怎么读

时间:2023-05-05 12:02:50 阅读:62857 作者:4796

一、前言在日常工作中,涉及与第三方接口的对接时,有时使用web服务方式。 本文主要介绍如何在. NET Framework上调用web服务。 首先创建web服务。 那里有两种方法。 一种是不参加的方法,另一种是参加的方法。

创建web服务后,请将web服务部署到IIS,并确保您可以访问它

二、静态引用是通过添加静态引用调用web服务的方式。 首先编写Winform程序。 界面中有一个按钮,单击该按钮调用web服务。

然后添加静态引用。 在调用web服务的项目中选择引用,右键单击,然后选择“添加服务引用”,如下图所示。

然后,输入部署在IIS上的web服务的地址。

最后单击“确定”按钮,静态浏览web服务完成。 添加完成后的项目结构如下图所示。

添加引用后,可以创建代码。

///summary///静态调用web service//summary//param name=' sender '/param//param name=' e '/paramprivatevolus //无引用的HelloWorld方法string value1=client.HelloWorld (; //带参数的方法string value2=client.Test ('带参数的方法) ); //输出messagebox.show($ )无参数方法返回值) {value1} )、有参数方法返回值) {value2} ) ); }执行程序测试:

现在可以调用web服务了。

三、动态调用上面描述了如何使用静态引用方式调用WebService,但这种方式有缺点。 如果发布的web服务地址发生变化,则必须重新添加web服务引用。 如果现有web服务发生更改,还必须更新现有服务参考。 这需要将代码放在现场。 有解决这个问题的方法吗? 那就是使用动态调用web服务的方法。

将配置文件添加到配置文件中,并将web服务地址、web服务提供的类名和要调用的方法名称写入配置文件中。

应用程序设置! -web服务地址--addkey='web服务address ' value=' http://localhost 33609008/testweb.asmx ' /! -web服务提供的类名--addkey=' class name ' value=' testweb ' /! -web服务方法名称--addkey=' method name ' value=' test ' /! 存储dll文件的地址--addkey=' file path ' value=' e :test '/appsettings

可以在界面中添加按钮,然后单击按钮以动态调用web服务来创建新的帮助类。

用户系统; using System.CodeDom; using System.CodeDom.Compiler; using System.IO; using System.Net; using System.Text; using系统. web; using System.Web.Caching; using system.web.services.description; using System.Xml.Serialization; namespacewebservicedemo { publicclasswebservicehelper }//summary//生成dll文件本地/////summary//param name=' ' param name='methodName '方法名称/param ///param name='

filePath">保存dll文件的路径</param> public static void CreateWebServiceDLL(string url,string className, string methodName,string filePath ) { // 1. 使用 WebClient 下载 WSDL 信息。 WebClient web = new WebClient(); Stream stream = web.OpenRead(url + "?WSDL"); // 2. 创建和格式化 WSDL 文档。 ServiceDescription description = ServiceDescription.Read(stream); //如果不存在就创建file文件夹 if (Directory.Exists(filePath) == false) { Directory.CreateDirectory(filePath); } if (File.Exists(filePath + className + "_" + methodName + ".dll")) { //判断缓存是否过期 var cachevalue = HttpRuntime.Cache.Get(className + "_" + methodName); if (cachevalue == null) { //缓存过期删除dll File.Delete(filePath + className + "_" + methodName + ".dll"); } else { // 如果缓存没有过期直接返回 return; } } // 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(); 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.OutputAssembly = filePath + className + "_" + methodName + ".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 StringBuilder(); foreach (CompilerError ce in result.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } //记录缓存 var objCache = HttpRuntime.Cache; // 缓存信息写入dll文件 objCache.Insert(className + "_" + methodName, "1", null, DateTime.Now.AddMinutes(5), TimeSpan.Zero, CacheItemPriority.High, null); } }}  

动态调用WebService代码:

/// <summary>/// 动态调用WebService/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_Dynamic_Click(object sender, EventArgs e){ // 读取配置文件,获取配置信息 string url = ConfigurationManager.AppSettings["WebServiceAddress"]; string className = ConfigurationManager.AppSettings["ClassName"]; string methodName = ConfigurationManager.AppSettings["MethodName"]; string filePath = ConfigurationManager.AppSettings["FilePath"]; // 调用WebServiceHelper WebServiceHelper.CreateWebServiceDLL(url, className, methodName, filePath); // 读取dll内容 byte[] filedata = File.ReadAllBytes(filePath + className + "_" + methodName + ".dll"); // 加载程序集信息 Assembly asm = Assembly.Load(filedata); Type t = asm.GetType(className); // 创建实例 object o = Activator.CreateInstance(t); MethodInfo method = t.GetMethod(methodName); // 参数 object[] args = {"动态调用WebService" }; // 调用访问,获取方法返回值 string value = method.Invoke(o, args).ToString(); //输出返回值 MessageBox.Show($"返回值:{value}");}  

程序运行结果:

如果说类名没有提供,可以根据url来自动获取类名:

/// <summary>/// 根据WebService的url地址获取className/// </summary>/// <param name="wsUrl">WebService的url地址</param>/// <returns></returns>private string GetWsClassName(string wsUrl){ string[] parts = wsUrl.Split('/'); string[] pps = parts[parts.Length - 1].Split('.'); return pps[0];}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。