xywuyiba7 发表于 2015-8-12 11:16:35

实战演习使Asp.Net Web Service脱离IIS

  WSE能够使ASP.Net Web Service寄宿到Console程序,Windows Service,Com+组件和Windows Forms应用程序中,此时,它能够用TCP协议或者其他任何可被接受的传输协议进行网络方法的调用。
  下面阐述一下如何创建一个不寄宿在IIS中的Web Service,并给出示例项目的源码。感兴趣的同学可以拿下去测试一下。
  示例项目将Windows Service作为网络服务的宿主程序,下面是创建网络服务和宿主程序的过程

[*]打开vs2005
[*]
创建一个Windows服务
[*]单击文件菜单,选择新工程
[*]在新工程的项目模板中,选择Windows服务
[*]输入工程名称,如WindowsServiceToHostASMXWebService
[*]点击确定

[*]
添加Microsoft.Web.Services3, System.Web.Services, 和 System.Web 的引用
[*]项目菜单中,点击添加引用
[*]选择.Net选项卡,选择Microsoft.Web.Services3, System.Web.Services, and System.Web ,点击确定

[*]添加配置文件app.config
[*]在工程中,添加一个名为HelloService.cs的文件,代码如下:
Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Services;

namespace WindowsServiceToHostASMXWebService
{
   
   
    public class HelloService : System.Web.Services.WebService
    {
      public HelloService()
      {

            //如果使用设计的组件,请取消注释以下行
            //InitializeComponent();
      }

      
      public string HelloWorld()
      {
            return "Hello World";
      }

    }
}

[*]更改工程中的Service.cs的代码,如下
Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using Microsoft.Web.Services3;
using Microsoft.Web.Services3.Addressing;
using Microsoft.Web.Services3.Messaging;
using System.Web.Services;
using System.Web.Services.Protocols;

namespace WindowsServiceToHostASMXWebService
{
    public partial class Service1 : ServiceBase
    {
      public Service1()
      {
            InitializeComponent();
      }

      protected override void OnStart(string[] args)
      {
            // TODO: 在此处添加代码以启动服务。
            Uri address = new Uri("soap.tcp://localhost/HelloService");
            SoapReceivers.Add(new EndpointReference(address), typeof(HelloService));
      }

      protected override void OnStop()
      {
            // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
            SoapReceivers.Clear();
      }
    }
}

[*]添加安装windows服务必须的ProjectInstaller
[*]这样在服务安装并启动(如何安装和启动不再赘述,不明白的可以上网查询)后,便可以作为web service的宿主程序了。下面的内容将阐述如何在创建对这样服务的代理和在客户端如何访问这样的服务。
[*]
要创建上面服务的代理,我没有找到很好的办法,wsdl.exe能创建代理类,这是.net framework默认提供的工具,但因为没有发布在web服务器上,因此无法直接对项目中的HelloService生成代理类,我用的是比较笨的方法,我首先创建了一个Asp.Net服务的工程,然后创建一个代码和HelloService.cs一样的网络服务,然后将其发布到Http服务器上,此时wsdl便能访问到http://localhost/host-in-winservice/service.asmx?wsdl   这样我用wsdl.exe工具,便可以产生默认的代理类Proxy.cs,操作如下:

[*]打开vs2005命令提示行
[*]cd到一个指定目录,比如d:\\


[*]用wsdl.exe生成默认代理文件Proxy.cs


[*]
这样在d盘就能得到一个Proxy.cs的文件,这就是默认的代理类,下面创建客户端程序

[*]
创建一个客户端程序,本文为Console程序,然后添加Microsoft.Web.Services3,
System.Web.Services, and System.Web的引用,将得到的代理类Proxy.cs拷贝到工程中,
下面是最重要的步骤:   在前面的翻译文档中,提到过使用WSE 3.0的网络服务的代理基类必须更改为WebServicesClientProtocol,(可参考WSE 3.0 文档翻译:WSE架构)

  因此必须首先将原代理类的基类做如下图所示的修改:
  原代理类

  新代理类

  并且因为网络服务的地址变化,将构造函数做如下修改
  原代理类

  新代理类:


[*]修改Proxy后,将Program.cs中的代码修改如下:
[*]测试运行,运行生成的Client.exe,得到如下图所示,表示成功:


  
   示例项目文件: 示例项目文件

有关生成代理类的方法改进
在写这篇文章的时候,没有找到一种比较好的方法,用于生成发布在非IIS中的网络服务的代理类,所以第九步比较麻烦。经朋友提示,我重新查看了下wse3的文档,发现了一个十分简单的办法,wse3提供了一个与wsdl.exe对应的工具:wsewsdl3.exe,使用它可以方便的产生代理类,步骤如下
wsewsdl3.exe在安装目录/Microsoft WSE\v3.0\Tools中,cmd-cd到该目录后,如下图所示操作,即可获取在工具的相同目录获得代理类文件,这个文件可以一点都不做修改,很好用   
   
页: [1]
查看完整版本: 实战演习使Asp.Net Web Service脱离IIS