案例应用情景:WebService服务可为多平台提供企业集成、用户信息验证(解决多系统登录问题)、跨平台的信息查询服务(国内手机归属地查询、天气预报web服务、股票行情数据服务、国内飞机航班时刻表web服务、中国电视节目预告web服务、腾讯QQ在线状态web服务、Email电子邮件地址验证web服务、ip地址来源搜索web服务)图形与多媒体(验证码图片web服务 支持中文、字母、数字)、 计算与单位换算(中文简体字《-》繁体字转换web服务)
?
?
本实例主要介绍:本地调用webservice和客户调用webservice两种情况。后面一种一般用在甲方和乙方做数据对接查询服务用,即所要的数据在对方的网站上。一方会把建好的webservice调用地址和方法名告诉对方,另一方根据该地址和方法编写客户端调用程序即下文的步骤四。
步骤:
一、先在站点建立WebService服务。(服务方先在自己的网站上建立webservice服务,编写好方法以便供客户方调用)
?
代码:
using System;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
public class myheader : SoapHeader
{
??? public string username;
??? public string password;
}?
/// <summary>
///WebService 的摘要说明
/// </summary>
[WebService(Namespace = "http://localhost/xcweb2011/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
?public myheader my;?
?public WebService () {
??? //??? //如果使用设计的组件,请取消注释以下行
??? //??? //InitializeComponent();
}
??? [WebMethod]
??? public string HelloWorld() {
???? return "Hello World";
??? }
? [WebMethod]??
? [SoapHeader( "my",Direction? =SoapHeaderDirection .In )]??
? public void testsoapheadin()?
? {
????? System.Diagnostics.Debug.Write(my.username);
????? System.Diagnostics.Debug.Write(my.password);
? }?
}
?
?
二、如未发布站点则建立iis站点
三、本地调用代码(服务方本地调用,即自己站点上代码)
?
四、客户端调用(客户方根据服务方给的webservice调用的https地址和方法名称而编写对应的调用程序。)
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;
using System.Net;
using System.Reflection;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Web.Services;
using System.Web.Services.Description;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
public partial class Default4 : System.Web.UI.Page
{
??? protected void Page_Load(object sender,EventArgs e)
??? {
??????? // 1. 使用 WebClient 下载 WSDL 信息。
??????? WebClient web = new WebClient();
??????? Stream stream = web.OpenRead("http://localhost/xcweb2011/WebService.asmx?WSDL");
??????? // 2. 创建和格式化 WSDL 文档。
??????? ServiceDescription description = ServiceDescription.Read(stream);
??????? // 3. 创建客户端代理代理类。
??????? ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
??????? importer.ProtocolName = "Soap"; // 指定访问协议。
??????? importer.Style = ServiceDescriptionImportStyle.Client; // 生成客户端代理。
??????? importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
??????? importer.AddServiceDescription(description,null,null); // 添加 WSDL 文档。
??????? // 4. 使用 CodeDom 编译客户端代理类。
??????? CodeNamespace nmspace = new CodeNamespace(); // 为代理类添加命名空间,缺省为全局空间。
??????? CodeCompileUnit unit = new CodeCompileUnit();
??????? unit.Namespaces.Add(nmspace);
??????? ServiceDescriptionImportWarnings warning = importer.Import(nmspace,unit);
??????? CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
??????? CompilerParameters parameter = new CompilerParameters();
??????? parameter.GenerateExecutable = false;
??????? parameter.GenerateInMemory = true;
??????? parameter.ReferencedAssemblies.Add("System.dll");
??????? parameter.ReferencedAssemblies.Add("System.XML.dll");
??????? parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
??????? parameter.ReferencedAssemblies.Add("System.Data.dll");
??????? CompilerResults result = provider.CompileAssemblyFromDom(parameter,unit);
??????? // 5. 使用 Reflection 调用 WebService。
??????? if (!result.Errors.HasErrors)
??????? {
??????????? Assembly asm = result.CompiledAssembly;
??????????? Type t = asm.GetType("WebService"); // 如果在前面为代理类添加了命名空间,此处需要将命名空间添加到类型前面。
??????????? object o = Activator.CreateInstance(t);
??????????? MethodInfo method = t.GetMethod("HelloWorld");
?????????? // Console.WriteLine(method.Invoke(o,null));
??????????? Response.Write(method.Invoke(o,null));
??????? }
??? }
}
五、注意开启webclient服务
?
六、小技巧
在第三步中可开启vs2008 输出窗口测试是否执行了WebService提供的方法。查看System.Diagnostics.Debug.Write(my.username);输出值。