實現基本的Hello World WCF服務(v4.5)

介紹

在這篇文章中,我們將從頭開始實現一個基本的WCF 4.5服務。我們將通過執行以下步驟來構建HelloWorld WCF服務:

  • 創建解決方案和項目
  • 創建WCF服務契約接口
  • 實現WCF服務
  • 在IIS Express中主持WCF服務
  • 創建一個客戶端應用程序來使用此WCF服務

創建HelloWorld解決方案和項目

在我們構建WCF服務之前,我們需要爲我們的服務項目創建一個解決方案。我們還需要一個保存所有文件的目錄。在本文中,我們將把項目源代碼保存在C:\ SOAWithWCFandLINQ \ Projects目錄中。我們將爲每個解決方案創建一個子文件夾,在此解決方案文件夾下,每個項目都有一個子文件夾。

對於這個HelloWorld解決方案,最終的目錄結構如下圖所示:

您不需要使用Windows資源管理器手動創建這些目錄; Visual Studio將在您創建解決方案和項目時自動創建它們。

現在按照以下步驟創建我們的第一個解決方案和HelloWorld項目:

1.啓動Visual Studio 2012(您可以在本文中使用Visual Studio Ultimate,Premium或Professional)。如果打開項目對話框彈出,點擊取消關閉它。

2.轉到菜單文件| 新| | 項目。新建項目對話框將出現。

3.從窗口的左側展開Installed(已安裝)其他項目類型,然後選擇Visual Studio解決方案作爲模板。從窗口的中間部分,選擇空白解決方案。

4.在窗口的底部,鍵入HelloWorld作爲名稱,然後鍵入  C:\ SOAWithWCFandLINQ \ Projects \  作爲位置。請注意,您不應在該位置輸入HelloWorld,因爲Visual Studio將自動爲新解決方案創建一個文件夾。

5.點擊確定按鈕關閉這個窗口,你的屏幕應該看起來像一個空的解決方案下面的圖像。

 

6.根據您的設置,佈局可能會有所不同。但是在解決方案資源管理器中仍然應該有一個空的解決方案 如果您沒有看到解決方案資源管理器,請轉到菜單“查看”| 解決方案資源管理器或按Ctrl + Alt + L將其啓動。

7.在解決方案資源管理器中,右鍵單擊解決方案並選擇添加| 新建項目...從上下文菜單中。你也可以去菜單File | 添加| 新項目...獲得相同的結果。下圖顯示了添加新項目的上下文菜單。

8.添加| 新建項目窗口現在應該出現在你的屏幕上。在此窗口的左側,選擇已安裝| Visual C#作爲模板,並在窗口的中間部分選擇“類庫”。

9.在窗口底部,輸入HelloWorldService作爲名稱。寫C:\ SOAWithWCFandLINQ \ Projects \ HelloWorld作爲位置。同樣,不要將HelloWorldService添加到位置,因爲Visual Studio將爲此新項目創建一個子文件夾(Visual Studio將使用解決方案文件夾作爲添加到解決方案中的所有新項目的默認基礎文件夾)。

您可能已經注意到在Visual Studio 2012中已經有一個用於WCF服務應用程序的模板(實際上在Visual Studio中有幾個WCF模板)。對於第一個例子,我們不會使用這個模板。相反,我們會自己創造一切來理解每一步的目的。這是您瞭解和掌握這項新技術的絕佳方式。在我的新書的下一章(詳見本文底部),我們將使用這個模板創建項目,所以我們不需要手動輸入很多代碼。

Visual Studio也會創建一個名爲Class1.cs的空類文件。稍後,我們將把這個默認名稱改爲更有意義的名稱,並將其名稱空間更改爲我們自己的名稱空間。

10.現在你可以點擊OK按鈕來關閉這個窗口。

一旦你點擊確定按鈕,Visual Studio就會爲你創建幾個文件。第一個文件是項目文件。這是項目目錄下的一個XML文件,它被稱爲HelloWorldService.csproj。

在項目文件夾下自動創建三個目錄 - 一個用於保存二進制文件,另一個用於保存目標文件,第三個用於項目的屬性文件。

現在屏幕上的窗口應該如下圖所示:

我們現在創建了一個新的解決方案和項目。接下來,我們將開發和建立這項服務。但是在我們走之前,我們需要爲這個項目做兩件事:

點擊Solution Explorer工具欄上的Show All Files按鈕,如上圖所示。點擊此按鈕將顯示項目文件夾下的硬盤中的所有文件和目錄,甚至包括項目中未包含的項目。確保您沒有選擇解決方案項目。否則,您將看不到“顯示所有文件”按鈕。

最後,爲了開發一個WCF服務,我們需要添加一個對System.ServiceModel程序集的引用。

  1. 在解決方案資源管理器窗口中,右鍵單擊HelloWorldService項目,然後從上下文菜單中選擇添加引用...。您也可以轉到菜單項Project | 添加參考...執行此操作。參考管理器對話窗口將出現在屏幕上。
  2. 從Assemblies \ Framework選項卡中檢查System.ServiceModel,然後單擊確定。現在,在解決方案資源管理器中,如果展開HelloWorldService項目的引用,您將看到添加了System.ServiceModel。另外,請注意System.Xml.Linq是默認添加的。稍後我們將在查詢數據庫時使用它。

創建HelloWorldService服務契約接口

在上一節中,我們爲HelloWorld WCF服務創建瞭解決方案和項目。從這一節開始,我們將開始構建HelloWorld WCF服務。首先,我們需要創建服務合同界面。

  1. 在解決方案資源管理器中,右鍵單擊HelloWorldService項目,然後選擇添加| 新建項目...從上下文菜單中。以下添加新項目 - HelloWorldService對話窗口將出現在您的屏幕上。
  2. 在窗口的左側,選擇已安裝| 將Visual C#項目作爲模板,並從窗口的中間部分選擇Interface。
  3. 在窗口的底部,將Interface1.cs中的Name更改爲IHelloWorldService.cs。
  4. 點擊添加按鈕。

現在,一個空的服務接口文件已經添加到項目中,我們將用它作爲服務接口。

按照以下步驟進行定製。

using System.ServiceModel;
[ServiceContract]
[OperationContract]
string GetMessage(string name);

該文件的最終內容IHelloWorldService.cs應如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;

namespace HelloWorldService
{
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string GetMessage(string name);
    }
}
  1. 添加using聲明:
  2. 將ServiceContract屬性添加到接口。這將指定該接口作爲WCF服務契約接口。
  3. 添加一個GetMessage方法到接口。這個方法將把一個字符串作爲輸入,並返回另一個字符串作爲結果。它也有一個屬性OperationContract。
  4. 將界面更改爲公共。

實現HelloWorldService服務契約

現在我們已經定義了一個服務契約接口,我們需要實現它。爲此,我們將重新使用Visual Studio早期爲我們創建的空類文件,並對其進行修改,使其成爲我們服務的實現類。

在我們修改這個文件之前,我們需要重命名它。在“解決方案資源管理器”窗口中,右鍵單擊文件Class1.cs,從上下文菜單中選擇重命名,並將其重命名爲HelloWorldService.cs

Visual Studio足夠聰明,能夠更改所有引用的相關文件以使用這個新名稱。您還可以選擇文件並從“屬性”窗口更改其名稱。

接下來,按照下面的步驟自定義這個類文件。

public class HelloWorldService: IHelloWorldService
public string GetMessage(string name)
{
   return "Hello world from " + name + "!";
}
  1. 打開文件HelloWorldService.cs
  2. 從更名Class1HelloWorldService,如果不爲你做。
  3. 使其IHelloWorldService隱式實現
  4. GetMessage給類添加一個方法。這是一個返回字符串的普通C#方法。您也可以右鍵單擊界面鏈接,然後選擇實現接口以添加此方法的框架。

文件HelloWorldService.cs的最終內容應如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloWorldService
{
    public class HelloWorldService: IHelloWorldService
    {
        public String GetMessage(string name)
        {
            return "Hello world from " + name + "!";
        }
    }
}

現在,建立這個項目。如果沒有生成錯誤,則表示您已經成功創建了第一個WCF服務。如果在命名空間“System”中看到編譯錯誤,如“ServiceModel”,則這是因爲您沒有System.ServiceModel正確添加名稱空間引用。重溫前面的部分來添加這個參考,並且你已經完成了設置。

接下來,我們將在一個環境中託管這個WCF服務,並創建一個客戶端應用程序來使用它。

在IIS Express中託管WCF服務

HelloWorldService是一個類庫。它必須託管在一個環境中,以便客戶端應用程序可以訪問它。在本節中,我們將學習如何使用IIS Express進行託管。稍後,在下一章中,我們將討論更多的WCF服務的託管選項。

創建主機應用程序

在Visual Studio 2012中有幾個內置的用於WCF服務的主機應用程序。但是,在本節中,我們將手動創建主機應用程序,以便您可以更好地理解主機應用程序的真實內容。在後面的章節中,我們將學習和使用內置的託管應用程序。

要使用IIS Express託管該庫,我們需要在解決方案中添加一個新網站。請按照以下步驟創建此網站:

如果您找不到ASP.NET空白網頁模板,請確保您在上一步中選擇了新建網站,而不是新建項目。

  1. 在解決方案資源管理器中,右鍵單擊解決方案文件並選擇添加| 新建網站...(始終顯示解決方案必須在選項|項目和解決方案中啓用才能看到解決方案文件)。彈出“添加新的網站”對話窗口。
  2. 選擇Visual C#| ASP.NET空網站“作爲模板,並將Web位置保留爲”文件系統“。將網站名稱從WebSite1更改爲C:\ SOAWithWCFandLINQ \ Projects \ HelloWorld \ HostDevServer並單擊確定。
  3. 現在在解決方案資源管理器中,解決方案中還有一個項目(HostDevServer)。它將如下所示:
  4. 接下來,我們需要將網站設置爲啓動項目。在解決方案資源管理器中,右鍵單擊網站HostDevServer,從上下文菜單中選擇設置爲啓動項目(或者您可以先從解決方案資源管理器中選擇網站,然後選擇菜單項網站|設置爲啓動項目)。應該在解決方案資源管理器中突出顯示HostDevServer網站,指出它現在是啓動項目。
  5. 因爲我們將從這個網站託管HelloWorldService,我們需要添加一個HelloWorldService引用到網站。在解決方案資源管理器中,右鍵單擊網站HostDevServer,然後從上下文菜單中選擇添加引用...。應該出現下面的引用管理器對話框:
  6. 在引用管理器對話框中,單擊Solutions \ Projects選項卡,檢查HelloWorldService項目,然後單擊確定。您將看到在HostDevServer網站下創建了一個新的目錄(bin),並且HelloWorldService項目中的兩個文件已經被複制到這個新的目錄中。稍後,訪問此網站時,Web服務器(IIS Express)將在此bin目錄中查找可執行代碼

測試主機應用程序

現在我們可以在IIS Express中運行網站了。如果啓動網站HostDevServer,請按Ctrl + F5或選擇Debug | 開始不調試...在菜單中,您將在瀏覽器中看到一個空的網站,並顯示錯誤。

如果按下F5(或從菜單中選擇了Debug | Start Debugging),則可能會看到一個對話框,顯示Debugging Not Enabled(未啓用調試)(如下所示)。選擇選項Run without debugging(相當於Ctrl + F5)並單擊OK按鈕繼續。我們將在下一章探討WCF服務的調試選項。在此之前,我們將繼續使用Ctrl + F5來啓動網站而不進行調試。

IIS Express

此時,您應該啓動並運行HostDevServer站點。這個網站實際上是在IIS Express裏面運行的。IIS Express是爲開發人員優化的輕量級自包含IIS版本。此Web服務器僅供開發人員使用,具有與Internet信息服務(IIS)服務器類似的功能。它也有一些限制,例如,它只支持HTTP和HTTPS協議。在Visual Studio中創建新網站時,IIS Express將自動爲其分配一個端口。您可以在網站的“屬性”中找到您網站的端口,如下圖所示。

當您需要調試或單元測試Web項目時,IIS Express通常從Visual Studio中啓動。如果您確實需要從Visual Studio外部啓動它,則可以使用以下格式的命令行語句:

C:\Program Files\IIS Express\iisexpress /path:c:\myapp\ /port:1054 /clr:v4.0

對於我們的網站,聲明應該是這樣的:

"C:\Program Files\IIS Express\iisexpress"
/path:C:\SOAwithWCFandLINQ\Projects\HelloWorld\HostDevServer /port:1054 /clr:v4.0

IISexpress.exe位於您的程序文件目錄下。在x64系統中,它應該在您的程序文件(x86)目錄下。

修改web.config文件

雖然我們現在可以啓動網站,但它只是一個空的網站。目前,它不託管我們的HelloWorldService。這是因爲我們沒有指定這個網站應該託管哪個服務,或者這個網站的入口點。

要指定我們的網站將託管哪個服務,我們可以添加一個svc文件到網站。從.NET 4.0開始,我們也可以使用無文件(svc-less)激活服務來實現這一點。在本節中,我們將採取無文件的方法來指定服務(請參考我以前的文章,看看如何用一個真正的svc文件)。

現在讓我們修改網站web.config文件來託管我們的HelloWorldService WCF服務。打開網站web.config文件,並將其更改爲如下所示:

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  <a href="http://go.microsoft.com/fwlink/?LinkId=169433">http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="false" targetFramework="4.5"/>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <serviceHostingEnvironment >
      <serviceActivations>
        <add factory="System.ServiceModel.Activation.ServiceHostFactory" 

         relativeAddress="~/HostDevServer/HelloWorldService.svc" 

         service="HelloWorldService.HelloWorldService"/>
      </serviceActivations>
    </serviceHostingEnvironment>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

請注意,該system.serviceModel節點是我們添加到配置文件的唯一代碼。

行爲httpGetEnabled是必不可少的,因爲我們希望其他應用程序能夠通過HTTP定位這個服務的元數據。沒有元數據,客戶端應用程序將無法生成代理,從而無法使用該服務。

以下是此配置文件中其他元素的簡要說明:

  • Configuration 是文件的根節點。
  • system.serviceModel 是所有WCF服務特定設置的頂級節點。
  • serviceHostingEnvironment 用於指定主機環境。
  • serviceActivations節點是您指定服務名稱及其相對地址的位置。此配置元素允許您定義映射到您的WCF服務類型的虛擬服務激活設置。這使得可以激活不帶.svc文件的WAS / IIS中託管的服務
  • serviceBehaviors節點內,您可以爲服務定義特定的行爲。在我們的例子中,我們已經指定了一個行爲,它啓用服務的服務元數據交換。

啓動主機應用程序

現在,如果通過按Ctrl + F5(不要使用F5或菜單選項Debug | Start Debugging,直到我們稍後討論它們)來啓動網站,那麼仍然會看到相同錯誤的空白網站。但是現在我們在這個網站上有一個服務,所以只要在地址後面添加HostDevServer / HelloWorldService.svc(它應該看起來像http:// localhost:1054 /),你就會得到這個服務的描述, ,如何獲得這個服務的wsdl文件,以及如何創建一個客戶端來使用這個服務。你應該看到一個類似於下面的頁面。

現在,單擊此頁面上的wsdl鏈接,您將獲得此服務的wsdl xml文件。wsdl文件提供了該服務的所有合同信息。在下一節中,我們將使用這個wsdl爲我們的客戶端應用程序生成一個代理。

創建一個客戶端來使用WCF服務

現在我們已經成功創建並託管了一個WCF服務,我們需要一個客戶端來使用這個服務。我們將創建一個C#客戶端應用程序來使用HelloWorldService。

在本節中,我們將創建一個Windows控制檯應用程序來調用WCF服務。在本書的後面,我們將創建其他類型的應用程序來測試我們的其他WCF服務,例如WinForms應用程序和WPF應用程序。

創建客戶端應用程序項目

首先,我們需要創建一個控制檯應用程序項目並將其添加到解決方案中。按照以下步驟創建控制檯應用程序:

  1. 在解決方案資源管理器中,右鍵單擊解決方案HelloWorld,然後選擇添加| 新建項目...從上下文菜單中。應該出現Add New Project對話框,如下所示。
  2. 選擇Visual C#| 控制檯應用程序作爲模板,將項目名稱從ConsoleApplication1的缺省值更改爲HelloWorldClient,並將位置保留爲C:\ SOAWithWCFandLINQ \ Projects \ HelloWorld點擊OK按鈕。新客戶端項目現在已經創建並添加到解決方案中。

生成代理和配置文件

爲了使用非RESTful WCF服務,客戶端應用程序必須首先獲取或生成代理類。

我們還需要一個配置文件來指定諸如服務綁定,服務地址和合同之類的東西。

要生成這兩個文件,我們可以使用命令行中的svcutil.exe工具。您可以按照以下步驟來生成這兩個文件:

"C:\Program Files\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\SvcUtil.exe" 
  http://localhost:1054/HostDevServer/HelloWorldService.svc?wsdl /out:HelloWorldServiceRef.cs /config:app.config

您將看到類似於以下屏幕截圖所示的輸出:

  1. 按Ctrl + F5或選擇菜單選項Debug |啓動服務 無需調試即可開始(此時,您的啓動項目仍應爲HostDevServer;否則,您需要將其設置爲啓動項目)。
  2. 服務啓動後,打開命令行窗口,將目錄更改爲客戶端應用程序文件夾,然後使用以下語法運行命令行svcutil.exe工具(SvcUtil.exe可能位於計算機中的其他目錄中;並且你需要用你的服務託管端口替代1054):

這裏生成了兩個文件:一個用於代理(HelloWorldServiceRef.cs),另一個用於配置(app.config)。

如果打開代理文件,您將看到service(IHelloWorldService的接口在代理類中被模仿,並且HelloWorldServiceClient創建一個客戶端類()來實現這個接口。在這個客戶類中,服務操作(GetMessage的實現只是一個將調用委託給操作的實際服務實現的包裝器。

在配置文件中,您將看到HelloWorldService諸如端點地址,綁定,超時設置以及服務安全行爲的定義。

您也可以在運行時動態創建代理,或者通過Channel Factory而不是代理來調用服務。請注意,如果您使用Channel Factory方法,則可能必須與客戶端共享您的接口DLL。

在後面的章節中,我們將學習如何通過Visual Studio生成代理和配置文件,當我們添加對WCF服務的引用時(Visual Studio實際上只是調用相同的命令行工具SvcUtil.exe來完成這項工作)。

自定義客戶端應用程序

在我們運行客戶端應用程序之前,我們還有一些工作要做。按照以下步驟完成定製:

  1. 重新加載app.config文件。如果您以前打開了app.config文件,那麼當您切換到Visual Studio 2012時,將會要求您重新加載app.config文件,因爲它已被更改。點擊“是”重新加載它。
  2. 將代理文件添加到項目。在解決方案資源管理器中,首先選擇HelloWorldClient項目,單擊顯示所有文件以顯示所有文件,現在在HelloWorldClient文件夾下您將看到代理文件(HelloWorldServiceRef.cs)。但是,該文件尚未包含在項目中。右鍵單擊它並選擇Include In Project將其包含在客戶端項目中。您也可以使用菜單項目| 添加現有項目...(或上下文菜單添加|現有項目...)將其添加到項目中。
  3. 添加對System.ServiceModel命名空間的引用就像我們爲HelloWorldService項目所做的那樣,我們還需要添加對WCF .NET System.ServiceModel程序集的引用。在解決方案資源管理器中,右鍵單擊HelloWorldClient項目,選擇添加引用...並檢查組件\ Framework \ System.ServiceModel然後點擊確定按鈕添加項目的引用。
  4. 修改program.cs來調用服務。program.cs中,添加以下行來初始化服務客戶端對象:
HelloWorldServiceClient client = new HelloWorldServiceClient();

HelloWorldServiceClient意味着客戶機運行時將在文件app.config中使用默認構造函數,因爲使用SvcUtil而存在。

然後我們可以像調用其他對象一樣調用它的方法:

Console.WriteLine(client.GetMessage("Mike Liu"));

將你的名字作爲參數傳遞給GetMessage方法,以便打印出你的消息。

運行客戶端應用程序

我們現在準備運行這個客戶端程序。

首先,確保服務主機應用程序HostDevServer已經啓動。如果您之前已經停止了它,現在就啓動它(您需要將HostDevServer設置爲啓動項目,然後按Ctrl + F5以非調試模式啓動),或者右鍵單擊項目HostDevServer並選擇“View in瀏覽器(Internet Explorer)“)。

然後,從解決方案資源管理器右鍵單擊項目HelloWorldClient,選擇設置爲啓動項目,然後按Ctrl + F5運行它。

你會看到如下圖所示的輸出:

將服務應用程序設置爲AutoStart

因爲我們知道我們必須在運行客戶端程序之前啓動服務主機應用程序,所以我們可以對解決方案進行一些更改來自動執行此任務,即在運行客戶端程序之前立即自動啓動服務。

爲此,在解決方案資源管理器中,右鍵單擊解決方案,從上下文菜單中選擇屬性,您將看到解決方案'HelloWorld'屬性頁面對話框。

在此頁面上,首先選擇選項按鈕,多個啓動項目。然後將HostDevServer的操作更改爲啓動而不進行調試。將HelloWorldClient更改爲相同的操作。注意HostDevServer必須高於HelloWorldClient。如果不是,請使用箭頭將其移至頂部。

現在要測試它,首先停止服務,然後按Ctrl + F5。您會注意到,HostDevServer是首先啓動,然後客戶端程序運行沒有錯誤。

請注意,這只能在Visual Studio IDE中使用。如果在沒有首先啓動服務的情況下從Windows資源管理器(C:\ SOAWithWCFandLINQ \ Projects \ HelloWorld \ HelloWorldClient \ bin \ Debug \ HelloWorldClient.exe啓動客戶端程序,服務將無法自動啓動,您將收到錯誤消息說“ 沒有端點在http:// localhost:1054 / HostDevServer / HelloWorldService.svc中偵聽 ”。

概要

在本文中,我們已經實現了一個基本的WCF服務,在IIS Express中託管它,並創建了一個命令行程序來引用和使用這個基本的WCF服務。在這一點上,你應該深入瞭解WCF服務的底層。使用Visual Studio WCF模板或自動化指導軟件包開發WCF服務時,您將受益於此。在下一章中,我們將探索更多的託管選項,並討論如何調試WCF服務。


本篇文章感謝Mike_Liu-QXUN工作室千訊工作室
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章