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
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class HelloService : System.Web.Services.WebService
{
public HelloService()
{
//如果使用設計的組件,請取消注釋以下行
//InitializeComponent();
}
[WebMethod]
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到該目錄後,如所示操作,即可擷取在工具的相同目錄獲得代理類檔案,這個檔案可以一點都不做修改,很好用