zoukankan      html  css  js  c++  java
  • WebService 在C#.NET中的使用

    前言

      最近很多项目上需要是调用其他系统的Webservice服务进行处理业务,第一次真正在项目中使用,感觉有些地方需要注意,故写下此文章(本文完全是个人运用理解,理解有误处请多多指正)

    一、创建WebService服务

      在添加Web服务后,VS将自动生成WebService服务类,且包含HelloWorld服务方法,用户可以在此处自定义服务方法,如添加AddFunction服务方法,标记方法属性标识为[WebMethod]

        /// <summary>
        /// DianWebService 的摘要说明
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
        // [System.Web.Script.Services.ScriptService]
        public class DianWebService : System.Web.Services.WebService
        {
    
            [WebMethod]//该属性标识为WebService服务方法
            public string HelloWorld()
            {
                return "Hello World";
            }
    
            [WebMethod]
            public int AddFunction(int a, int b)
            {
                return a + b;
            }
        }

    二、调用WebService服务

      在.NET平台下,存在两种方式调用WebService服务:一是直接在项目中添加服务引用;二是通过动态代理来调用服务。

      

      方法一,项目中直接添加WebService服务引用(在项目菜单中选择“添加服务引用”)

      说明:

      区域1:Webservice服务的地址

      区域2:设置Webservice服务的命名空间

      区域3:针对该引入的服务做进一步的详细配置,包括服务的访问权限、是否异步等

      说明:

      区域1:定义引用的服务的访问权限,分为public和internal两种

      区域2:确定引入的服务是否生成异步操作(此处暂时还没搞清能用于干什么)

      区域3:配置web服务的高级配置,在此处配置后,才能够直接在项目中使用web服务类进行访问。否则无法直接访问服务中的接口方法。

     

      特别需要注意:如果此处没有添加web引用,VS在创建web服务时,只会自动生成对应的服务协议接口(***Soap)和服务代理类(***SoapClient),其实我们可以通过接口查看到Webservice服务中的公开接口方法,以及通过服务代理类调用web服务接口方法。

      比较明显的地方在于,未添加web引用时,VS自动创建的是服务引用(自动生成在Service References下),而添加引用后,vs创建的是web引用(自动成成在Web References下)。

      (此处的***Soap和***SoapClient两个命名不太规范,哪位大拿能否指点下这两个专业术语如何称呼)

      说明:

      区域1:Webservice服务的地址

      区域2:web服务的引用名(web服务的子命名空间)

      区域3:操作添加web引用

    //在项目中可以直接创建该WebService服务进行调用方法
                WebService.DianWebService web = new WebService.DianWebService();
                web.HelloWorld();
                web.AddFunction(1, 2);

      注意:调用Webservice服务的项目不能和提供Webservice服务的项目为同一个项目,否则会出现远程调用服务被关闭的异常,在测试代码时,可以使用一个项目调用另一个项目提供的服务(其中主要是方位不同地址或不同端口的Webservice服务就行)

    方法二,通过动态代理来调用服务

      先创建一个动态代理的服务,之后在项目中需要用到的地方直接根据传递不同参数调用不同的Webservice服务

     public class Webservices
        {
            /// <summary<  
            /// 实例化WebServices  
            /// </summary<  
            /// <param name="url"<WebServices地址</param<  
            /// <param name="methodname"<调用的方法</param<  
            /// <param name="args"<把webservices里需要的参数按顺序放到这个object[]里</param<  
            public static object InvokeWebService(string namespaceName, string url, string methodname, object[] args)
            {
    
                //这里的namespace是需引用的webservices的命名空间,在这里是写死的,大家可以加一个参数从外面传进来。  
                if (string.IsNullOrEmpty(namespaceName))
                    namespaceName = "ServiceWebTest";
                try
                {
                    //获取WSDL  
                    WebClient wc = new WebClient();
                    Stream stream = wc.OpenRead(url + "?WSDL");
                    ServiceDescription sd = ServiceDescription.Read(stream);
                    string classname = sd.Services[0].Name;
                    ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
                    sdi.AddServiceDescription(sd, "", "");
                    CodeNamespace cn = new CodeNamespace(namespaceName);
    
                    //生成客户端代理类代码  
                    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 System.Text.StringBuilder();
                        foreach (System.CodeDom.Compiler.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(namespaceName + "." + classname, true, true);
                    object obj = Activator.CreateInstance(t);
                    System.Reflection.MethodInfo mi = t.GetMethod(methodname);
    
                    return mi.Invoke(obj, args);
                }
                catch
                {
                    return null;
                }
            }
        }
    //在需要调用服务的地方调用
      var objectUser = Webservices.InvokeWebService(namespaceName, url, methodname, new object[] { 1,2});
                Response.Write(objectUser);
    

      

  • 相关阅读:
    Tree UVA
    stringstream的使用
    Trees on the level UVA
    strchr和strstr函数
    sscanf的用法
    Dropping Balls UVA
    Boxes in a Line UVA
    Broken Keyboard (a.k.a. Beiju Text) UVA
    Matrix Chain Multiplication (堆栈)
    出栈次序
  • 原文地址:https://www.cnblogs.com/workformylove/p/3805524.html
Copyright © 2011-2022 走看看