C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用
关于soapheader调用,可以参考
C#调用Java的WebService添加SOAPHeader验证
1.直接调用
已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL。这个比较常见也很简单
即有完整的webservice文件目录如下图所示,
也可以在本地IIS根据webservice文件目录新发布一个webservice,然后程序动态调用,修改Url
1 | public new string Url { set ; get ; } |
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了。
举个使用它的例子:
object[] args = new object[1]; args.SetValue("cyy_JS", 0);
DataTable dt = WebServiceHelper.InvokeWebService("http://192.168.0.10/DBMS_CYY/DBMS_Service.asmx", "GetUserTreeListData", args) as 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, true , true ); 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
分类:
C#开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架