class="area">
Windows通訊基礎(WCF)--即我們原來知道的Indigo--是微軟用於Windows的新的連接(connected)系統平台。本文介紹了一些基本的原理,建立了一個簡單的應用程序。
WCF是一種不斷增強的和進化的技術,它把以前所有獨特和分散的微軟連接技術合並到了單一的System.ServiceModel名稱空間之中。WCF中所包含了Web服務(ASMX)、Web服務擴展(WS*)、微軟消息隊列(MSMQ)、企業級服務、COM+和.NET Remoting。
讓一個名稱空間包含所有這些內容是非常有益的,它使我們設計、開發和部署需要連接的應用程序大大地簡化了。有了WCF之後,你不需要在大量不同的名稱空間的實現之間進行選擇,也不需要編寫類型來建立連接的應用程序。無論你的應用程序是通過松散耦合的Web服務連接,還是通過緊密耦合的企業級服務來連接,編寫代碼的模型都是一致的,不同的信息類型之間的轉換變得平緩很多--因為它們都使用了同一個編程名稱空間。
使用WCF WCF遵循"軟件即服務"模型,也就是所有的功能單元都被定義為服務。開發者不需要關心通訊(communications)是如何工作的,而只需要關心服務的位置、服務之間如何對話以及如何描述這些內容。因此,對於任何服務來說,你都必須知道下面三個問題的答案:
1.服務的地址。服務在哪兒?它在互聯網上、自己的網絡中的某台計算機上、還是在自己使用的計算機上?
2.服務的綁定。如何與它對話?我是使用SOAP還是MSMQ?
3.服務的規范(Contract)。它能為我做什麼事情?我應該給它傳遞什麼類型的數據?它返回什麼樣的數據?
如果你對Web服務非常熟悉,或許你已經理解了WSDL術語中的這三個方面的內容。WCF采用了這種定義服務工作方式的流行和成功的方法,並對它進行了擴展,使它能夠與其它形式的通訊(微軟消息隊列、企業級服務、COM+和.NET Remoting)一起工作。
第一個WCF應用程序:建立服務 如果你現在還不太熟悉WCF的一些術語,例如綁定、規范、尋址(addressing)等等,也不要擔心;這類術語最好從示例中學習。在本文後面的部分中,你將建立自己的第一個Indigo應用程序。為了建立這個應用程序,你必須遵循一定的步驟。
開始之前,在硬盤上建立一個物理目錄(C:\tconvert)以存放應用程序,並把這個目錄映射為IIS虛擬目錄(叫做Temperatures)。如果你使用的是Windows Server 2003,那麼請確保ASPNET進程能夠訪問這個目錄。
第一步是建立一個Windows通訊基礎服務規范。它基本上是一個被標記的接口,表明自己是一個服務規范。詳見列表1。
列表1:WCF服務規范。它顯示了溫度轉換服務示例的服務規范。
namespace Devx.Indigo.Samples
{
using System;
using System.ServiceModel;
[ServiceContract()]
public interface ITemperatures
{
[OperationContract]
double ftoc(double n1);
[OperationContract]
double ctof(double n1);
}
}
請注意上面屬性的標記。ServiceContract()屬性表明ITemperatures接口將成為WCF中的一個服務規范,OperationContract()表明ftoc和ctof將被定義為該規范中的操作符(operation)。因此,該過程是很簡單的。
第二步是在它上面進行擴展,建立用於實現列表1中定義的接口的代碼。下面的代碼建立了Service類。
using System;
using System.ServiceModel;
namespace Devx.Indigo.Samples
{
[ServiceContract()]
public interface ITemperatures
{
[OperationContract]
double ftoc(double n1);
[OperationContract]
double ctof(double n1);
}
public class TemperatureService : ITemperatures
{
public double ftoc(double f)
{
double dReturn = 0.0;
dReturn = ((f - 32) * 5) / 9;
return dReturn;
}
public double ctof(double c)
{
double dReturn = 0.0;
dReturn = ((c + 32) * 9) / 5;
return dReturn;
}
}
}
你可以使用下面的命令來編譯這段代碼,即在命令提示符下輸入下面一行內容。你必須給.NET框架組件設置PATH(路徑)信息。
csc /r:System.ServiceModel.dll
/out:TemperatureService.dll /t:library
TemperatureService.cs
在tconvert目錄下建立BIN子目錄,並把上面生成的DLL文件復制到該目錄中。
下一步,配置web.config文件(見列表2)。web.config包含了WCF處理各項事務需要的所有信息。仔細查閱這個文件是很有幫助意義的。請注意,這個文件的語法在每個版本中都好像有很大的改變,甚至於在微軟的在線文檔和供下載的文檔中也有所不同。
列表2:TemperatureService的 Web.Config文件。這個文件定義了TemperatureService的服務、行為和綁定。
<?xml version="1.0" encoding="utf-8" ?>
<configuration
xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<system.serviceModel>
<services>
<service behaviorConfiguration="TemperatureServiceBehavior"
type="Devx.Indigo.Samples.TemperatureService" >
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="Devx.Indigo.Samples.ITemperatures" />
</service>
</services>
<behaviors>
<behavior configurationName="TemperatureServiceBehavior"
returnUnknownExceptionsAsFaults="True">
</behavior>
</behaviors>
<bindings>
<wsHttpBinding>
<binding configurationName="Binding1" />
</wsHttpBinding>
</bindings>
</system.serviceModel>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
在編寫WCF應用程序的時候,理解列表2所示的web.config文件對我們很有用處,特別是在你沒有使用Visual Studio .NET的情況下。<system.ServiceModel>標記保存著WCF服務的全部信息。
服務、行為和綁定 使用WCF的時候,你必須在web.config中配置三種信息:服務、行為和綁定。
服務 服務的設置中有兩個部分非常重要:首先是行為的位置,其次是服務的類型。它在自己的名稱空間中定義,在例子中就是Devx.Indigo.Samples.TemperatureService。
行為 Behaviors元素使你能夠設置服務在特定環境中應該做出的反應(操作)。它需要configurationName屬性,這樣服務就可以映射它。在列表2中,服務被配置為:遇到錯誤(fault)的時候就返回任意的未知異常(exception)。
綁定 在bindings元素中定義綁定和綁定類型。在例子中,這個元素很簡單,被指定為HTTP類型綁定,其標識為Binding1。你可以查看MSDN文檔和大綱(在這個配置文件的最上面定義的)以獲取更多的信息。
最後的事務是建立服務轉換器(service mapper)。請在tconvert目錄中建立一個文本文件,取名為"service.svc"。它應該包含下面一行代碼:
<@Service language=c# Debug="true"
class="Devx.Indigo.Samples.TemperatureService" %>
該Indigo服務已經建好了。你可以通過URL(http:///TemperatureService/service.svc)來訪問它。你會看到圖1所示的結果。
圖1:運行中的WCF服務:在建立服務之後,當你從浏覽器來訪問它的時候,會看到與此類似的一個窗口,它顯示了如何使用服務。
第一個Indigo應用程序:建立客戶端 Windows通訊基礎SDK提供了一個叫做svcutil.exe的工具,它為你的客戶端建立代理(proxy)代碼。對於這個服務,請在命令提示符下提交下面的命令(可能需要根據你的服務器設置做一些修改):
svcutil /language:C# /config:app.config
http://192.168.0.1/Temperatures/service.svc?wsdl
由於我們沒有指定該服務的名稱空間,.NET生成的WSDL就使用了tempuri.org Web名稱空間這個默認值。請不要把這個名作空間與代碼(Java中稱為程序包)的名稱空間混淆了(在代碼中的名稱空間是Devx.Indigo.Samples)。同樣,svcutil生成的代碼叫做tempuri.org.cs,它是你的代理類。
你可以在應用程序類中用如下所示的方式來使用這個代理類:
using System;
using System.ServiceModel;
namespace Devx.Indigo.Samples
{
class TemperatureClient
{
static void Main()
{
using (TemperaturesProxy proxy = new TemperaturesProxy("default"))
{
double c = 0.0;
double f = 0.0;
c = 22.2;
f = proxy.ctof(c);
Console.WriteLine("{0} degrees C = {1} degrees F", c, f);
f = 93.7;
c = proxy.ftoc(f);
Console.WriteLine("{0} degrees C = {1} degrees F", c, f);
proxy.Close();
}
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
}
}
}
你可以使用下面的命令把上述的類編譯