LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#调用WebService的3种方式:直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用

admin
2023年8月22日 15:23 本文热度 551

关于soapheader调用,可以参考:C#调用Java的WebService添加SOAPHeader验证

1.直接调用

已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL。这个比较常见也很简单,即有完整的webservice文件目录如下图所示:

 

也可以在本地IIS根据webservice文件目录新发布一个webservice,然后程序动态调用,修改Url:

1
public new string Url { setget; }

2.根据wsdl文件生成webservice 的.cs文件 及 生成dll C#调用  

有时没有这么多文件,只有wsdl文件,wsdl文件可以有别人提供或者根据webservice地址获取:

http://localhost:8888/WS.asmx?wsdl

 

 Visual Studio 2013->Visual Studio Tools->VS2013 开发人员命令提示
 
命令行输入:

wsdl E:\WS.wsdl /out:WS.cs

 
E:\WS.wsdl  是wsdl文件存储路径,也可以是http://localhost:8888/WS.asmx?wsdl,不报错的话,看路径下 Program Files\Microsoft Visual Studio 12.0\WS.cs已经自动生成。
 
.cs文件看函数声明,结构体等都非常方便,然后命令行执行:
csc /t:library WS.cs
 
同样的路径下,生成了WS.dll,拷贝出去放到项目文件夹下,C# winform程序也可以添加引用了。生成的文件默认在这里:

  
默认生成的SOAP版本为1.1,可以

G:\Program Files\Microsoft Visual Studio 12.0>wsdl E:\e.wsdl /protocol:SOAP12 /out:e.cs

来指定1.2  

3.C# 动态调用WebService  

在C#程序中,若要调用WebService,一般是采用"添加Web引用"的方式来实现的。但如果此WebService的URL是在程序运行过程中才能获得的,那怎么办呢?那就必须是"动态"调用这个WebService了。举个使用它的例子:

 [] args =  [, );             
DataTable dt = WebServiceHelper.InvokeWebService(, , args)  DataTable;

  恩~有点麻烦,这意味着每次我都要把想调用的函数的参数组织成一个object[]才行,且每次调用InvokeWebService都是在内存中创建动态程序集,效率极低。则次种方法绝对没有直接用“实例名.方法名(参数列表)”来的舒服。我把它放到一个叫WebServiceHelper.cs的类里面了。 

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
using System.IO;
using System.Web.Services.Description;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.CodeDom;
  
/// <summary>  
        /// 动态调用WebService  
        /// </summary>  
        /// <param name="url">WebService地址</param>  
        /// <param name="classname">类名</param>  
        /// <param name="methodname">方法名(模块名)</param>  
        /// <param name="args">参数列表</param>  
        /// <returns>object</returns>  
        public static object InvokeWebService(string url, string classname, string methodname, object[] args) 
        
            string @namespace "ServiceBase.WebService.DynamicWebLoad"
            if (classname == null || classname == ""
            
                classname = WebServiceHelper.GetClassName(url); 
            
            //获取服务描述语言(WSDL)  
            WebClient wc = new WebClient(); 
            Stream stream = wc.OpenRead(url + "?WSDL"); 
            ServiceDescription sd = ServiceDescription.Read(stream); 
            ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); 
            sdi.AddServiceDescription(sd, """"); 
            CodeNamespace cn = new CodeNamespace(@namespace); 
            //生成客户端代理类代码  
            CodeCompileUnit ccu = new CodeCompileUnit(); 
            ccu.Namespaces.Add(cn); 
            sdi.Import(cn, ccu); 
            CSharpCodeProvider csc = new CSharpCodeProvider(); 
            ICodeCompiler icc = csc.createCompiler(); 
            //设定编译器的参数  
            CompilerParameters cplist = new CompilerParameters(); 
            cplist.Generateexecutable = false
            cplist.GenerateInMemory = true
            cplist.ReferencedAssemblies.Add("System.dll"); 
            cplist.ReferencedAssemblies.Add("System.XML.dll"); 
            cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); 
            cplist.ReferencedAssemblies.Add("System.Data.dll"); 
            //编译代理类  
            CompilerResults cr = icc.CompileAssemblyfromDom(cplist, ccu); 
            if (true == cr.Errors.HasErrors) 
            
                System.Text.StringBuilder sb = new StringBuilder(); 
                foreach (CompilerError ce in cr.Errors) 
                
                    sb.Append(ce.ToString()); 
                    sb.Append(System.Environment.NewLine); 
                
                throw new Exception(sb.ToString()); 
            
            //生成代理实例,并调用方法  
            System.Reflection.Assembly assembly = cr.CompiledAssembly; 
            Type t = assembly.GetType(@namespace "." + classname, truetrue); 
            object obj = Activator.createInstance(t); 
            System.Reflection.MethodInfo mi = t.GetMethod(methodname); 
            return mi.Invoke(obj, args); 
        
   
        private static string GetClassName(string url) 
        
            string[] parts = url.Split('/'); 
            string[] pps = parts[parts.Length - 1].Split('.'); 
            return pps[0]; 
        

  

参考 http://blog.csdn.net/chuxiamuxiang/article/details/5731988


该文章在 2023/8/22 15:29:06 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved