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的安全验证。