萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> Windows通訊基礎編程之基礎知識

Windows通訊基礎編程之基礎知識

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();
  }
 }
}
  你可以使用下面的命令把上述的類編譯
copyright © 萬盛學電腦網 all rights reserved