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

也可以在本地IIS根据webservice文件目录新发布一个webservice,然后程序动态调用,修改Url
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
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;
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# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll C#调用、动态调用
标签:
原文地址:http://www.cnblogs.com/jhlong/p/5693917.html