page contents

C#调用WebService的方法介绍

本文讲述了C#调用WebService的方法介绍!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-08-kcyGrq7G62f463df34d45.png本文讲述了C#调用WebService的方法介绍!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

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

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

二、静态引用

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

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

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

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

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

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

运行程序测试:

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

三、动态调用

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Caching;
using System.Web.Services.Description;
using System.Xml.Serialization;
 
namespace WebServiceDemo
{
    public class WebServiceHelper
    {
        /// <summary>
        /// 生成dll文件保存到本地
        /// </summary>
        /// <param name="url">WebService地址</param>
        /// <param name="className">类名</param>
        /// <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代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/// <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来自动获取类名:

1
2
3
4
5
6
7
8
9
10
11
/// <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];
}

到此这篇关于C#调用WebService的文章就介绍到这了。更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2022-08-11 10:05
  • 阅读 ( 533 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章