WebService

1. 什么是WebService

2. WebService 的组成

3. 如何定义一个WebService方法

4. 如何调用WebService方法

 

什么是WebService

  当我们的软件需要与外部程序进行交互,或者说我们提供一些提定接口,供其它软件来调用我们程序时,可以使用WebService进行交互,当然,这只是其中一种,还有Remoting、WCF等方式。

 

WebService 的组成

  一个WebService的组成部分可分为:WSDL + XSD + SOAP。

  其中,WSDL是描述一个Web Service服务的结构,可通过该结构生成对应的代理类,如想知道该Web Service的结构,只须在服务地址后面加上 "?wsdl" 即可。XSD表示交互数据的结构。SOAP用来验证安全性。

 

如何定义一个WebService方法  

  首先,我们先创建一个Web服务项目,然后在该项目中创建服务文件(.asmx)。

  其次,声明一个供外部使用的WebService方法,与普通的方法定义没有区别,但只许在该方法的头部加上 [WebMethod]标签,则系统会对它进行相对应的处理,方法声明如下:  

[WebMethod]
public string Demo()
{
    return "Hello,Web Service!";
}

  运行该服务后,则在页面中可看到一个Demo的接口。如果将[WebMethod]属性去掉,再运行,会出现什么情况呢,可自己动手试试看。

 

如何调用WebService方法

  调用WebService的方法有如下几种:

  1. 在程序中进行 "添加服务引用"。添加完成后即可对服务进行调用。

  2. 通过服务提供的wsdl,生成代理类,通过代理类进行方法的调用。这种方式与第一种调用方式其实是一样的,编译器也是将服务的wsdl生成代理类,再供调用。

      通过 wsdl 生成代理类方法如下:首先,打开VS自带的命令行,然后输入:

      wsdl /out:输出路径/文件名.cs WebService服务地址

  3. 动态调用WebService,此种方式为提供调用地址、方法、参数,进行本地生成代理类,再进行调用。动态调用WebService代码如下代码段。

    using System;   
    using System.Net;   
    using System.IO;   
    using System.CodeDom;   
    using Microsoft.CSharp;   
    using System.CodeDom.Compiler;   
    using System.Web.Services.Description;   
    using System.Web.Services.Protocols;   
     
    namespace Common   
    {   
        /* 调用方式   
         *   string url = "http://localhost:8090/Service.asmx" ;   
         *   string[] args = new string[2] ;   
         *   args[0] = "";   
         *   args[1] = "" ;   
         *   object result = WebServiceHelper.InvokeWebService(url ,"Demo" ,args) ;   
         *   Response.Write(result.ToString());   
         */   
        public class WebServiceHelper   
        {   
            #region InvokeWebService   
            /// < summary>   
            /// 动态调用web服务   
            /// < /summary>   
            /// < param name="url">WSDL服务地址< /param>   
            /// < param name="methodname">方法名< /param>   
            /// < param name="args">参数< /param>   
            /// < returns>< /returns>   
            public static object InvokeWebService(string url, string methodname, object[] args)   
            {   
                return WebServiceHelper.InvokeWebService(url, null, methodname, args);   
            }   
     
            /// < summary>   
            /// 动态调用web服务   
            /// < /summary>   
            /// < param name="url">WSDL服务地址< /param>   
            /// < param name="classname">类名< /param>   
            /// < param name="methodname">方法名< /param>   
            /// < param name="args">参数< /param>   
            /// < returns>< /returns>   
            public static object InvokeWebService(string url, string classname, string methodname, object[] args)   
            {   
                string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";   
                if ((classname == null) || (classname == ""))   
                {   
                    classname = WebServiceHelper.GetWsClassName(url);   
                }   
     
                try   
                {   
                    //获取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 icc = new CSharpCodeProvider();   
     
                    //设定编译参数   
                    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(@namespace + "." + classname, true, true);   
                    object obj = Activator.CreateInstance(t);   
                    System.Reflection.MethodInfo mi = t.GetMethod(methodname);   
     
                    return mi.Invoke(obj, args);   
     
                    /*   
                    PropertyInfo propertyInfo = type.GetProperty(propertyname);   
                    return propertyInfo.GetValue(obj, null);   
                    */   
                }   
                catch (Exception ex)   
                {   
                    throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));   
                }   
            }   
     
            private static string GetWsClassName(string wsUrl)   
            {   
                string[] parts = wsUrl.Split('/');   
                string[] pps = parts[parts.Length - 1].Split('.');   
     
                return pps[0];   
            }   
            #endregion   
        }   
    } 

 

本节就先将到WebService的基本用法,下节将介绍WebService的安全验证

posted on 2012-12-02 22:18  STM85  阅读(778)  评论(0编辑  收藏  举报

导航