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的安全验证。
浙公网安备 33010602011771号