• C#调用WebService的方法介绍


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

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

     

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

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

     

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

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

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

     

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

    1. ///
    2. /// 静态调用WebService
    3. ///
    4. ///
    5. ///
    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.    
    2.     <add key="WebServiceAddress" value="http://localhost:9008/TestWeb.asmx"/>
    3.    
    4.     <add key="ClassName" value="TestWeb"/>
    5.    
    6.     <add key="MethodName" value="Test"/>
    7.    
    8.     <add key="FilePath" value="E:\Test"/>


    在界面上添加一个按钮,点击按钮可以动态调用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.         ///
    17.         /// 生成dll文件保存到本地
    18.         ///
    19.         /// WebService地址
    20.         /// 类名
    21.         /// 方法名
    22.         /// 保存dll文件的路径
    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. ///
    2. /// 动态调用WebService
    3. ///
    4. ///
    5. ///
    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的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。 

  • 相关阅读:
    Hadoop3教程(一):Hadoop的定义、组成及全生态概览
    开学季好物推荐!这些优秀的产品值得一买
    15天深度复习JavaWeb的详细笔记(一)——JDBC
    pinia状态管理器使用
    JavaScript关于对象的小挑战
    nextjs-一个基于React的全栈框架
    使用IntelliJ IDEA查看接口的全部实现方法
    基于深度学习的文本分类案例:使用LSTM进行情绪分类
    联通研究院霍龙社博士深度解析“AI项目到底适不适合开源”
    远程仓库创建好后,出现版本冲突,提交不成功,pull也会失败的解决方法
  • 原文地址:https://blog.csdn.net/qq395537505/article/details/126034481