案例应用情景: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);输出值。