当前位置:   article > 正文

C#调用WebService的方法介绍_c# webservice

c# webservice

这篇文章介绍了C#调用WebService的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、前言
在日常工作中,如果涉及到与第三方进行接口对接,有的会使用WebService的方式,这篇文章主要讲解在.NET Framework中如何调用WebService。首先我们创建一个WebService,里面有两个方法:一个无参的方法,一个有参的方法:

 

创建好了WebService以后,把WebService部署到IIS上,并确保可以访问

二、静态引用
这种方式是通过添加静态引用的方式调用WebService。首先创建一个Winform程序,界面上有一个按钮,点击按钮调用WebService:

 

然后添加静态引用。在要调用WebService的项目上选择引用,然后右键选择“添加服务引用”,如下图所示:

 然后输入IIS上部署的WebService地址:

最后点击“确定”按钮即可完成静态引用WebService,添加完成以后的项目结构如下图所示:

 

添加完引用以后,就可以编写代码了:

  1. /// <summary>
  2. /// 静态调用WebService
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void btn_Static_Click(object sender, EventArgs e)
  7. {
  8.     // 实例化类
  9.     CallWebService.TestWebSoapClient client = new CallWebService.TestWebSoapClient();
  10.     // 调用无参的HelloWorld方法
  11.     string value1= client.HelloWorld();
  12.     // 调用有参的方法
  13.     string value2 = client.Test("有参方法");
  14.     // 输出
  15.     MessageBox.Show($"无参方法返回值:{value1},有参方法返回值:{value2}");
  16. }

运行程序测试:

这样就可以实现调用WebService了。

三、动态调用
上面我们说了如何使用静态引用的方式调用WebService,但是这种方式有一个缺点:如果发布的WebService地址改变,那么就要重新添加WebService的引用。如果是现有的WebService发生了改变,也要更新现有的服务引用,这需要把代码放到现场才可以。那么有没有什么方式可以解决这种问题呢?那就是使用动态调用WebService的方法。

我们在配置文件里面添加配置,把WebService的地址、WebService提供的类名、要调用的方法名称,都写在配置文件里面:

  1. <appSettings>
  2.     <!--WebService地址-->
  3.     <add key="WebServiceAddress" value="http://localhost:9008/TestWeb.asmx"/>
  4.     <!--WebService提供的类名-->
  5.     <add key="ClassName" value="TestWeb"/>
  6.     <!--WebService方法名-->
  7.     <add key="MethodName" value="Test"/>
  8.     <!--存放dll文件的地址-->
  9.     <add key="FilePath" value="E:\Test"/>
  10. </appSettings>


在界面上添加一个按钮,点击按钮可以动态调用WebService,新建一个帮助类:

  1. using System;
  2. using System.CodeDom;
  3. using System.CodeDom.Compiler;
  4. using System.IO;
  5. using System.Net;
  6. using System.Text;
  7. using System.Web;
  8. using System.Web.Caching;
  9. using System.Web.Services.Description;
  10. using System.Xml.Serialization;
  11.  
  12. namespace WebServiceDemo
  13. {
  14.     public class WebServiceHelper
  15.     {
  16.         /// <summary>
  17.         /// 生成dll文件保存到本地
  18.         /// </summary>
  19.         /// <param name="url">WebService地址</param>
  20.         /// <param name="className">类名</param>
  21.         /// <param name="methodName">方法名</param>
  22.         /// <param name="filePath">保存dll文件的路径</param>
  23.         public static void CreateWebServiceDLL(string url,string className, string methodName,string filePath )
  24.         {
  25.             // 1. 使用 WebClient 下载 WSDL 信息。
  26.             WebClient web = new WebClient();
  27.             Stream stream = web.OpenRead(url + "?WSDL");
  28.             // 2. 创建和格式化 WSDL 文档。
  29.             ServiceDescription description = ServiceDescription.Read(stream);
  30.             //如果不存在就创建file文件夹
  31.             if (Directory.Exists(filePath) == false)
  32.             {
  33.                 Directory.CreateDirectory(filePath);
  34.             }
  35.  
  36.             if (File.Exists(filePath + className + "_" + methodName + ".dll"))
  37.             {
  38.                 //判断缓存是否过期
  39.                 var cachevalue = HttpRuntime.Cache.Get(className + "_" + methodName);
  40.                 if (cachevalue == null)
  41.                 {
  42.                     //缓存过期删除dll
  43.                     File.Delete(filePath + className + "_" + methodName + ".dll");
  44.                 }
  45.                 else
  46.                 {
  47.                     // 如果缓存没有过期直接返回
  48.                     return;
  49.                 }
  50.             }
  51.  
  52.             // 3. 创建客户端代理代理类。
  53.             ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
  54.             // 指定访问协议。
  55.             importer.ProtocolName = "Soap";
  56.             // 生成客户端代理。
  57.             importer.Style = ServiceDescriptionImportStyle.Client; 
  58.             importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
  59.             // 添加 WSDL 文档。
  60.             importer.AddServiceDescription(description, null, null);
  61.             // 4. 使用 CodeDom 编译客户端代理类。
  62.             // 为代理类添加命名空间,缺省为全局空间。
  63.             CodeNamespace nmspace = new CodeNamespace();       
  64.             CodeCompileUnit unit = new CodeCompileUnit();
  65.             unit.Namespaces.Add(nmspace);
  66.             ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
  67.             CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
  68.             CompilerParameters parameter = new CompilerParameters();
  69.             parameter.GenerateExecutable = false;
  70.             // 可以指定你所需的任何文件名。
  71.             parameter.OutputAssembly = filePath + className + "_" + methodName + ".dll";  
  72.             parameter.ReferencedAssemblies.Add("System.dll");
  73.             parameter.ReferencedAssemblies.Add("System.XML.dll");
  74.             parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
  75.             parameter.ReferencedAssemblies.Add("System.Data.dll");
  76.             // 生成dll文件,并会把WebService信息写入到dll里面
  77.             CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
  78.             if (result.Errors.HasErrors)
  79.             {
  80.                 // 显示编译错误信息
  81.                 System.Text.StringBuilder sb = new StringBuilder();
  82.                 foreach (CompilerError ce in result.Errors)
  83.                 {
  84.                     sb.Append(ce.ToString());
  85.                     sb.Append(System.Environment.NewLine);
  86.                 }
  87.                 throw new Exception(sb.ToString());
  88.             }
  89.             //记录缓存
  90.             var objCache = HttpRuntime.Cache;
  91.             // 缓存信息写入dll文件
  92.             objCache.Insert(className + "_" + methodName, "1", null, DateTime.Now.AddMinutes(5), TimeSpan.Zero, CacheItemPriority.High, null);
  93.         }
  94.     }
  95. }

动态调用WebService代码:

  1. /// <summary>
  2. /// 动态调用WebService
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void btn_Dynamic_Click(object sender, EventArgs e)
  7. {
  8.     // 读取配置文件,获取配置信息
  9.     string url = ConfigurationManager.AppSettings["WebServiceAddress"];
  10.     string className = ConfigurationManager.AppSettings["ClassName"];
  11.     string methodName = ConfigurationManager.AppSettings["MethodName"];
  12.     string filePath = ConfigurationManager.AppSettings["FilePath"];
  13.     // 调用WebServiceHelper
  14.     WebServiceHelper.CreateWebServiceDLL(url, className, methodName, filePath);
  15.     // 读取dll内容
  16.     byte[] filedata = File.ReadAllBytes(filePath + className + "_" + methodName + ".dll");
  17.     // 加载程序集信息
  18.     Assembly asm = Assembly.Load(filedata);
  19.     Type t = asm.GetType(className);
  20.     // 创建实例
  21.     object o = Activator.CreateInstance(t);
  22.     MethodInfo method = t.GetMethod(methodName);
  23.     // 参数
  24.     object[] args = {"动态调用WebService" };
  25.     // 调用访问,获取方法返回值
  26.     string value = method.Invoke(o, args).ToString();
  27.     //输出返回值
  28.     MessageBox.Show($"返回值:{value}");
  29. }

程序运行结果:

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

到此这篇关于C#调用WebService的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/596900
推荐阅读
  

闽ICP备14008679号