搭建WebService服务 【转】

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

 

posted @ 2012-04-25 14:19  在路上·稻草人  阅读(454)  评论(0编辑  收藏  举报