zoukankan      html  css  js  c++  java
  • C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用

     关于soapheader调用,可以参考

    C#调用Java的WebService添加SOAPHeader验证

    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

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

    G:Program FilesMicrosoft 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的类里面了。
     
    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

  • 相关阅读:
    Codeforces Round #370 (Div. 2) D. Memory and Scores DP
    HDU 5876 Sparse Graph BFS 最短路
    HDU 5875 Function st + 二分
    HDU 5869 Different GCD Subarray Query 离线+树状数组
    2016 ACM/ICPC Asia Regional Dalian Online HDU 5877 Weak Pair treap + dfs序
    detection in video and image
    vs 2012打开vs2013的sln
    dl in image process
    classifier
    mark
  • 原文地址:https://www.cnblogs.com/jhlong/p/5693917.html
Copyright © 2011-2022 走看看