教學課程:使用 Azure WCF 轉送將內部部署 Windows Communication Foundation (WCF) REST 服務公開至外部用戶端
本教學課程說明如何使用 Azure 轉送建置 WCF 轉送用戶端應用程式和服務。 如同其原始的 WCF 對應項目,服務是可公開一或多個端點的結構。 每個端點都會公開一或多個服務作業。 服務的端點指定可找到服務的位址、內含用戶端與服務通訊所需資訊的繫結,以及可定義服務提供給其用戶端之功能的合約。 WCF 與 WCF 轉送的主要差異在於端點是在雲端公開,而不是在您的電腦本機上公開。
在您逐步完成本教學課程中的各節之後,您將會有執行中的服務。 您也會有可叫用服務作業的用戶端。
您將在本教學課程中執行下列工作:
- 安裝本教學課程的必要條件。
- 建立轉送命名空間。
- 建立 WCF 服務合約。
- 實作 WCF 合約。
- 裝載並執行 WCF 服務以向轉送服務進行註冊。
- 建立服務合約的 WCF 用戶端。
- 設定 WCF 用戶端。
- 實作 WCF 用戶端。
- 執行應用程式。
必要條件
若要完成本教學課程,您需要下列必要條件:
- Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
- Visual Studio 2015 或更新版本。 本教學課程中的範例使用 Visual Studio 2019。
- 適用於 .NET 的 Azure SDK。 從 SDK 下載頁面進行安裝。
建立轉送命名空間
第一個步驟是建立命名空間,並取得共用存取簽章 (SAS) 金鑰。 命名空間會為每個透過轉送服務公開的應用程式提供應用程式界限。 建立服務命名空間時,系統會自動產生 SAS 金鑰。 服務命名空間與 SAS 金鑰的組合會提供一個認證,供 Azure 用來驗證對應用程式的存取權。
登入 Azure 入口網站。
選取左側功能表上的 [所有服務]。 選取 [整合],並搜尋「轉送」,再將滑鼠移至 [轉送] 上方,然後選取 [建立]。
在 [建立命名空間] 頁面上,遵循下列步驟:
選擇要在其中建立命名空間的 Azure 訂用帳戶。
針對資源群組,選擇將放置命名空間的現有資源群組,或是建立新的資源群組。
輸入轉送命名空間的名稱。
選取要用來裝載命名空間的區域。
選取頁面底部的 [檢閱 + 建立] 。
在 [檢閱 + 建立] 頁面上,選取 [建立]。
幾分鐘後,您會看到命名空間的 [轉送] 頁面。
取得管理認證
在 [轉送] 頁面上,選取左側功能表上的 [共用存取原則]。
在 [共用存取原則] 頁面上,選取 [RootManageSharedAccessKey]。
在 [SAS 原則: RootManageSharedAccessKey] 下,選取 [主要連接字串] 旁的 [複製] 按鈕。 此動作會將連接字串複製到剪貼簿以供稍後使用。 將此值貼到記事本或一些其他暫存位置。
重複前一個步驟,複製 [主要金鑰] 的值並貼到暫存位置以供稍後使用。
定義 WCF 服務合約
服務合約會指定服務所支援的作業。 作業是 Web 服務方法或函式。 合約可以透過定義 C++、C# 或 Visual Basic 介面建立。 介面中的每一個方法都會對應到一個特定的服務作業。 每個介面都必須已套用 ServiceContractAttribute 屬性,而且每個作業都必須已套用 OperationContractAttribute 屬性。 如果介面中具備 OperationContractAttribute 屬性的方法沒有 ServiceContractAttribute 屬性,則不會公開該方法。 程序後面的範例會提供這些工作的程式碼。 如需合約與服務的詳細討論,請參閱設計和實作服務。
使用介面建立轉送合約
以系統管理員身分啟動 Microsoft Visual Studio。 若要這樣做,請以滑鼠右鍵按一下 Visual Studio 程式圖示,然後選取 [以系統管理員身分執行]。
在 Visual Studio 中,選取 [建立新專案]。
在 [建立新專案] 中,針對 C# 選擇 [主控台應用程式 (.NET Framework)],然後選取 [下一步]。
將專案命名為 EchoService,然後選取 [建立]。
在 [方案總管] 中,以滑鼠右鍵按一下專案,然後選取 [管理 NuGet 套件]。 在 [NuGet 套件管理員] 中選取 [瀏覽],然後搜尋並選擇 [WindowsAzure.ServiceBus]。 選取 [安裝] 並接受使用條款。
此套件會自動新增服務匯流排程式庫和 WCF
System.ServiceModel
的參考。 System.ServiceModel 是可讓您以程式設計方式存取 WCF 基本功能的命名空間。 服務匯流排會使用 WCF 的許多物件和屬性來定義服務合約。在 Program.cs 的開頭處新增下列
using
陳述式:using System.ServiceModel; using Microsoft.ServiceBus;
將命名空間名稱從
EchoService
的預設名稱變更為Microsoft.ServiceBus.Samples
。重要
本教學課程使用 C# 命名空間
Microsoft.ServiceBus.Samples
,也就是設定 WCF 用戶端一節中的組態檔所使用合約型受控類型的命名空間。 在建置此範例時,您可以指定您想要的任何命名空間。 不過,除非您後來在應用程式組態檔中相應地修改合約的命名空和服務,否則本教學課程將無法運作。 在 App.config 檔案中指定的命名空間必須與在 C# 檔案中指定的命名空間相同。緊接在
Microsoft.ServiceBus.Samples
命名空間宣告後面 (但在命名空間內),定義名為IEchoContract
的新介面,並將ServiceContractAttribute
屬性套用至命名空間值為https://samples.microsoft.com/ServiceModel/Relay/
的介面。 將下列程式碼貼上到命名空間宣告之後:[ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")] public interface IEchoContract { }
命名空間值與您的整個程式碼範圍中使用的命名空間不同。 然而,命名空間值會作為此合約的唯一識別碼。 明確指定命名空間可避免將預設命名空間值新增至合約名稱。
注意
一般而言,服務合約命名空間包含命名配置 (其中包含版本資訊)。 在服務合約命名空間中包含版本資訊,可讓服務定義具有新命名空間的新服務合約並在新的端點上公開它,藉此區隔重大變更。 如此一來,用戶端可以繼續使用舊服務合約,而不需要更新。 版本資訊可以包含日期或組建編號。 如需詳細資訊,請參閱服務版本設定。 在本教學課程中,服務合約命名空間的命名配置不包含版本資訊。
在
IEchoContract
介面中,針對IEchoContract
合約在介面中公開的單一作業宣告方法,並將OperationContractAttribute
屬性套用至您想要公開為公用 WCF 轉送合約一部分的方法,如下所示:[OperationContract] string Echo(string text);
直接在
IEchoContract
介面定義之後,宣告同時繼承自IEchoContract
與IClientChannel
介面的通道,如下所示:public interface IEchoChannel : IEchoContract, IClientChannel { }
通道是 WCF 物件,主機和用戶端可透過它彼此傳遞資訊。 稍後,您將對此通道撰寫程式碼,以回應兩個應用程式之間的資訊。
選取 [建置]>[建置方案],或選取 Ctrl+Shift+B,以確認您的工作到目前為止的正確性。
WCF 合約的範例
下列程式碼示範定義 WCF 轉送合約的基本介面。
using System;
using System.ServiceModel;
namespace Microsoft.ServiceBus.Samples
{
[ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
public interface IEchoContract
{
[OperationContract]
String Echo(string text);
}
public interface IEchoChannel : IEchoContract, IClientChannel { }
class Program
{
static void Main(string[] args)
{
}
}
}
現在已建立介面,您可以實作此介面。
實作 WCF 合約
要建立 Azure 轉送,必須先使用介面建立合約。 如需建立介面的詳細資訊,請參閱上一節。 下一個程序會實作介面。 這項工作牽涉到建立名為 EchoService
的類別,該類別會實作使用者定義的 IEchoContract
介面。 實作合約後,接著即可使用 App.config 組態檔設定介面。 此組態檔包含應用程式的必要資訊。 這項資訊包括服務名稱、合約名稱,以及用來與轉送服務通訊的通訊協定類型。 程序後面的範例會提供用來執行這些工作的程式碼。 如需如何實作服務合約的一般討論,請參閱實作服務合約。
緊接在
IEchoContract
介面的定義之後,建立名為EchoService
的新類別。EchoService
類別會實作IEchoContract
介面。class EchoService : IEchoContract { }
類似於其他介面實作,您可以在不同的檔案中實作定義。 不過,在此教學課程中,實作會位於與介面定義和
Main()
方法相同的檔案中。將 ServiceBehaviorAttribute 屬性套用至
IEchoContract
介面。 此屬性會指定服務名稱和命名空間。 這麼做之後,EchoService
類別會如下所示︰[ServiceBehavior(Name = "EchoService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")] class EchoService : IEchoContract { }
實作在
EchoService
類別的IEchoContract
介面中定義的Echo
方法。public string Echo(string text) { Console.WriteLine("Echoing: {0}", text); return text; }
選取 [建置] > [建置方案],或選取 Ctrl+Shift+B。
定義服務主機的設定
此組態檔類似於 WCF 組態檔。 其中包含服務名稱、端點和繫結。 端點是 Azure 轉送公開的位置,供用戶端與主機互相通訊。 繫結是用來通訊的通訊協定類型。 主要差異在於這個已設定的服務端點會參考不屬於 .NET Framework 的 NetTcpRelayBinding 繫結。 NetTcpRelayBinding 是服務所定義的其中一個繫結。
在 [方案總管] 中按兩下 App.config,以在 Visual Studio 編輯器中開啟該檔案。
在
<appSettings>
元素中,以您的 Azure 轉送命名空間名稱以及您在先前步驟中複製的 SAS 金鑰取代預留位置。在
<system.serviceModel>
標記內,加入<services>
元素。 您可以在單一組態檔中定義多個轉送應用程式。 不過,本教學課程只會定義一個。<?xmlversion="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <services> </services> </system.serviceModel> </configuration>
在
<services>
元素內,加入<service>
元素以定義服務的名稱。<service name="Microsoft.ServiceBus.Samples.EchoService"> </service>
在
<service>
元素內,定義端點合約的位置,以及端點的繫結類型。<endpoint contract="Microsoft.ServiceBus.Samples.IEchoContract" binding="netTcpRelayBinding"/>
端點會定義用戶端將在何處尋找主應用程式。 稍後,本教學課程會使用此步驟來建立 URI,以透過 Azure 轉送完全公開主機。 繫結會宣告我們將使用 TCP 作為與轉送服務通訊的通訊協定。
選取 [建置]>[建置方案],或選取 Ctrl+Shift+B,以確認您的工作到目前為止的正確性。
服務合約的實作範例
下列程式碼示範服務合約的實作。
[ServiceBehavior(Name = "EchoService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
class EchoService : IEchoContract
{
public string Echo(string text)
{
Console.WriteLine("Echoing: {0}", text);
return text;
}
}
下列程式碼顯示與服務相關聯的 App.config 檔案的基本格式。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Microsoft.ServiceBus.Samples.EchoService">
<endpoint contract="Microsoft.ServiceBus.Samples.IEchoContract" binding="netTcpRelayBinding" />
</service>
</services>
<extensions>
<bindingExtensions>
<add name="netTcpRelayBinding"
type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</bindingExtensions>
</extensions>
</system.serviceModel>
</configuration>
裝載並執行 WCF 服務以向轉送服務登錄
此步驟描述如何執行 Azure 轉送服務。
建立轉送認證
在
Main()
中,建立兩個變數,以儲存命名空間以及從主控台視窗讀取的 SAS 金鑰。Console.Write("Your Service Namespace: "); string serviceNamespace = Console.ReadLine(); Console.Write("Your SAS key: "); string sasKey = Console.ReadLine();
SAS 金鑰稍後將用來存取您的專案。 命名空間會當做參數傳遞至
CreateServiceUri
以建立服務 URI。使用 TransportClientEndpointBehavior 物件,宣告您將使用 SAS 金鑰作為認證類型。 將下列程式碼直接加在最後一個步驟中新增的程式碼之後。
TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior(); sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);
建立服務的基底位址
在上一節中新增的程式碼後面,建立服務基底位址的 Uri
執行個體。 此 URI 會指定服務匯流排配置、命名空間和服務介面的路徑。
Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");
值 "sb" 是服務匯流排配置的縮寫。 這表示我們將使用 TCP 作為通訊協定。 先前在 NetTcpRelayBinding 指定為繫結時,此配置也指定於組態檔中。
在本教學課程中,URI 為 sb://putServiceNamespaceHere.windows.net/EchoService
。
建立並設定服務主機
同樣在
Main()
中,將連線模式設定為AutoDetect
。ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
連線模式可描述服務用來與轉送服務通訊的通訊協定 (HTTP 或 TCP)。 使用預設設定
AutoDetect
時,服務會嘗試透過可用的 TCP 連線至 Azure 轉送,如果 TCP 無法使用,則會透過 HTTP 連線。 此結果有別於服務針對用戶端通訊指定的通訊協定。 該通訊協定取決於使用的繫結。 例如,服務可以使用 BasicHttpRelayBinding 繫結,指定它的端點會透過 HTTP 來與用戶端通訊。 該相同服務可以指定ConnectivityMode.AutoDetect
,讓服務能夠透過 TCP 與 Azure 轉送通訊。使用本節稍早建立的 URI,建立服務主機。
ServiceHost host = new ServiceHost(typeof(EchoService), address);
服務主機是將服務具現化的 WCF 物件。 在此,您會將您要建立的服務類型 (
EchoService
類型) 以及要公開服務的位址傳給它。在 Program.cs 檔案的開頭處,新增 System.ServiceModel.Description 和 Microsoft.ServiceBus.Description 的參考。
using System.ServiceModel.Description; using Microsoft.ServiceBus.Description;
回到
Main()
,設定要啟用公開存取的端點。IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);
此步驟會通知轉送服務可藉由檢查專案的 Atom 摘要公開找到您的應用程式。 如果您將
DiscoveryType
設定為private
,則用戶端仍可存取服務。 不過,服務在搜尋Relay
命名空間時並不會顯示。 相反地,用戶端必須事先知道端點路徑。將服務認證套用至在 App.config 檔案中定義的服務端點︰
foreach (ServiceEndpoint endpoint in host.Description.Endpoints) { endpoint.Behaviors.Add(serviceRegistrySettings); endpoint.Behaviors.Add(sasCredential); }
如前所述,您可能已在組態檔中宣告多個服務和端點。 若是如此,此程式碼會周遊組態檔及搜尋每個應套用您的認證的端點。 在本教學課程中,組態檔只有一個端點。
開啟服務主機
同樣在
Main()
中,新增以下一行以開啟服務。host.Open();
通知使用者此服務正在執行,以及說明如何關閉服務。
Console.WriteLine("Service address: " + address); Console.WriteLine("Press [Enter] to exit"); Console.ReadLine();
完成時,關閉服務主機。
host.Close();
選取 Ctrl+Shift+B 以建置專案。
在主控台應用程式中裝載服務的範例
完整的服務程式碼應如下所示。 程式碼包括教學課程先前步驟的服務合約和實作,並在主控台應用程式中裝載服務。
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Description;
namespace Microsoft.ServiceBus.Samples
{
[ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
public interface IEchoContract
{
[OperationContract]
String Echo(string text);
}
public interface IEchoChannel : IEchoContract, IClientChannel { };
[ServiceBehavior(Name = "EchoService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
class EchoService : IEchoContract
{
public string Echo(string text)
{
Console.WriteLine("Echoing: {0}", text);
return text;
}
}
class Program
{
static void Main(string[] args)
{
ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
Console.Write("Your Service Namespace: ");
string serviceNamespace = Console.ReadLine();
Console.Write("Your SAS key: ");
string sasKey = Console.ReadLine();
// Create the credentials object for the endpoint.
TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);
// Create the service URI based on the service namespace.
Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");
// Create the service host reading the configuration.
ServiceHost host = new ServiceHost(typeof(EchoService), address);
// Create the ServiceRegistrySettings behavior for the endpoint.
IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);
// Add the Relay credentials to all endpoints specified in configuration.
foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
{
endpoint.Behaviors.Add(serviceRegistrySettings);
endpoint.Behaviors.Add(sasCredential);
}
// Open the service.
host.Open();
Console.WriteLine("Service address: " + address);
Console.WriteLine("Press [Enter] to exit");
Console.ReadLine();
// Close the service.
host.Close();
}
}
}
建立服務合約的 WCF 用戶端
下一項工作是建立用戶端應用程式,並定義您後續將實作的服務合約。 這些步驟類似於用來建立服務的步驟︰定義合約、編輯 App.config 檔案、使用認證連線至轉送服務等等。 程序後面的範例提供用來執行這些工作的程式碼。
若要在目前的 Visual Studio 方案中為用戶端建立新的解決專案︰
- 在 [方案總管] 中,以滑鼠右鍵按一下目前的解決方案 (不是專案),並選取 [新增]>[新增專案]。
- 在 [新增專案] 中,針對 C# 選取 [主控台應用程式 (.NET Framework)],然後選取 [下一步]。
- 將 EchoClient 指定為專案的名稱,然後選取 [建立]。
在 [方案總管] 的 EchoClient 專案中按兩下 Program.cs,以在編輯器中開啟該檔案 (如果尚未開啟)。
將命名空間名稱從
EchoClient
的預設名稱變更為Microsoft.ServiceBus.Samples
。-
在 [方案總管] 中,以滑鼠右鍵按一下 EchoClient,然後選取 [管理 NuGet 套件]。
選取 [瀏覽],然後搜尋並選取 WindowsAzure.ServiceBus。 選取 [安裝] 並接受使用條款。
在 Program.cs 檔案中新增 System.ServiceModel 命名空間的
using
陳述式。using System.ServiceModel;
下列範例所示,將服務合約定義新增至命名空間。 此定義與 [服務] 專案中使用的定義相同。 請在
Microsoft.ServiceBus.Samples
命名空間的頂端新增此程式碼。[ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")] public interface IEchoContract { [OperationContract] string Echo(string text); } public interface IEchoChannel : IEchoContract, IClientChannel { }
選取 Ctrl+Shift+B 以建置用戶端。
EchoClient 專案的範例
下列程式碼會顯示 EchoClient 專案中的 Program.cs 檔案目前的狀態。
using System;
using Microsoft.ServiceBus;
using System.ServiceModel;
namespace Microsoft.ServiceBus.Samples
{
[ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
public interface IEchoContract
{
[OperationContract]
string Echo(string text);
}
public interface IEchoChannel : IEchoContract, IClientChannel { }
class Program
{
static void Main(string[] args)
{
}
}
}
設定 WCF 用戶端
在此步驟中,您可為基本用戶端應用程式建立 App.config 檔案,以存取先前在本教學課程中建立的服務。 此 App.config 檔案會定義端點的合約、繫結和名稱。 程序後面的範例提供用來執行這些工作的程式碼。
在 [方案總管] 的 EchoClient 專案中按兩下 App.config,以在 Visual Studio 編輯器中開啟該檔案。
在
<appSettings>
元素中,以您的服務命名空間名稱以及您在先前步驟中複製的 SAS 金鑰取代預留位置。在
system.serviceModel
項目中,新增<client>
項目。<?xmlversion="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <client> </client> </system.serviceModel> </configuration>
此程式碼會宣告您將定義 WCF 樣式的用戶端應用程式。
在
client
元素內,定義端點的名稱、合約和繫結類型。<endpoint name="RelayEndpoint" contract="Microsoft.ServiceBus.Samples.IEchoContract" binding="netTcpRelayBinding"/>
此程式碼會定義端點的名稱。 此外也會定義在服務中定義的合約,以及用戶端應用程式使用 TCP 與 Azure 轉送進行通訊的事實。 端點名稱在下一步中用來連結此端點組態與服務 URI。
選取 [檔案]>[儲存全部]。
App.config 檔案的範例
下列程式碼會顯示 Echo 用戶端的 App.config 檔案。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint name="RelayEndpoint"
contract="Microsoft.ServiceBus.Samples.IEchoContract"
binding="netTcpRelayBinding"/>
</client>
<extensions>
<bindingExtensions>
<add name="netTcpRelayBinding"
type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</bindingExtensions>
</extensions>
</system.serviceModel>
</configuration>
實作 WCF 用戶端
在本節中,您會實作基本用戶端應用程式,以存取您先前在本教學課程中建立的服務。 與此服務類似,用戶端會執行許多相同的作業來存取 Azure 轉送:
- 設定連線模式。
- 建立可找出主機服務的 URI。
- 定義安全性認證。
- 將認證套用至連線。
- 開啟連線。
- 執行應用程式特定的工作。
- 關閉連線。
不過,其中一項主要差異在於用戶端應用程式會使用通道連線至轉送服務。 而此服務會使用對 ServiceHost 的呼叫。 程序後面的範例提供用來執行這些工作的程式碼。
實作用戶端應用程式
將連線模式設定為
AutoDetect
。 在 EchoClient 應用程式的Main()
方法中新增下列程式碼。ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
定義變數,以保留服務命名空間以及從主控台讀取之 SAS 金鑰的值。
Console.Write("Your Service Namespace: "); string serviceNamespace = Console.ReadLine(); Console.Write("Your SAS Key: "); string sasKey = Console.ReadLine();
建立可定義轉送專案中主機位置的 URI。
Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");
建立服務命名空間端點的認證物件。
TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior(); sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);
建立通道處理站,以載入 App.config 檔案中說明的組態。
ChannelFactory<IEchoChannel> channelFactory = new ChannelFactory<IEchoChannel>("RelayEndpoint", new EndpointAddress(serviceUri));
通道工廠是一個 WCF 物件,可建立通道以供服務與用戶端應用程式進行通訊。
套用認證。
channelFactory.Endpoint.Behaviors.Add(sasCredential);
建立並開啟服務的通道。
IEchoChannel channel = channelFactory.CreateChannel(); channel.Open();
撰寫 Echo 的基本使用者介面和功能。
Console.WriteLine("Enter text to echo (or [Enter] to exit):"); string input = Console.ReadLine(); while (input != String.Empty) { try { Console.WriteLine("Server echoed: {0}", channel.Echo(input)); } catch (Exception e) { Console.WriteLine("Error: " + e.Message); } input = Console.ReadLine(); }
程式碼會使用通道物件的執行個體作為服務的 Proxy。
關閉通道,並關閉工廠。
channel.Close(); channelFactory.Close();
本教學課程的範例程式碼
完整的程式碼應如下所示。 下列程式碼說明如何建立用戶端應用程式、如何呼叫服務的作業,以及如何在完成作業呼叫之後關閉用戶端。
using System;
using Microsoft.ServiceBus;
using System.ServiceModel;
namespace Microsoft.ServiceBus.Samples
{
[ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
public interface IEchoContract
{
[OperationContract]
String Echo(string text);
}
public interface IEchoChannel : IEchoContract, IClientChannel { }
class Program
{
static void Main(string[] args)
{
ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
Console.Write("Your Service Namespace: ");
string serviceNamespace = Console.ReadLine();
Console.Write("Your SAS Key: ");
string sasKey = Console.ReadLine();
Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");
TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);
ChannelFactory<IEchoChannel> channelFactory = new ChannelFactory<IEchoChannel>("RelayEndpoint", new EndpointAddress(serviceUri));
channelFactory.Endpoint.Behaviors.Add(sasCredential);
IEchoChannel channel = channelFactory.CreateChannel();
channel.Open();
Console.WriteLine("Enter text to echo (or [Enter] to exit):");
string input = Console.ReadLine();
while (input != String.Empty)
{
try
{
Console.WriteLine("Server echoed: {0}", channel.Echo(input));
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
input = Console.ReadLine();
}
channel.Close();
channelFactory.Close();
}
}
}
執行應用程式
選取 Ctrl+Shift+B 以建置解決方案。 本節會建置您在先前的步驟中建立的用戶端專案和服務專案。
執行用戶端應用程式之前,您必須確定服務應用程式正在執行。 在 [方案總管] 中,以滑鼠右鍵按一下 EchoService 解決方案,然後選取 [屬性]。
在 [屬性頁] 中移至 [通用屬性]>[啟始專案],然後選擇 [多個啟始專案]。 確定 EchoService 顯示在清單中的最前面。
將 EchoService 和 EchoClient 專案的 [動作] 方塊設定為 [啟動]。
選取 [專案相依性]。 在 [專案] 中,選取 [EchoClient]。 在 [相依於] 中,確定已選取 [EchoService]。
選取 [確定] 以關閉 [屬性頁]。
選取 F5 以執行這兩個專案。
兩個主控台視窗隨即開啟並提示您輸入命名空間名稱。 服務必須先執行,因此請在 EchoService 主控台視窗中輸入命名空間,然後選取 Enter 鍵。
接著,主控台會提示您輸入 SAS 金鑰。 輸入 SAS 金鑰,然後選取 Enter 鍵。
以下是主控台視窗的範例輸出。 這裡的值只是範例。
Your Service Namespace: myNamespace
Your SAS Key: <SAS key value>
服務應用程式會將它所接聽的位址列印到主控台視窗,如下列範例所示。
Service address: sb://mynamespace.servicebus.windows.net/EchoService/
Press [Enter] to exit
在 EchoClient 主控台視窗中,輸入您先前針對此服務應用程式輸入的相同資訊。 為此用戶端應用程式輸入相同的服務命名空間和 SAS 金鑰值。
輸入這些值之後,客戶端會開啟服務的通道,並提示您輸入一些文字,如下列控制台輸出範例所示。
Enter text to echo (or [Enter] to exit):
輸入一些文字以傳送至服務應用程式,然後選取 Enter 鍵。 這段文字會透過 Echo 服務作業傳送至服務,並如下列範例輸出所示出現在服務主控台視窗。
Echoing: My sample text
用戶端應用程式會接收
Echo
作業的傳回值 (此值是原始文字),並將它列印至主控台視窗。 下列文字是用戶端主控台視窗的範例輸出。Server echoed: My sample text
您可以繼續以這種方式將文字訊息從用戶端傳送至服務。 完成後,請在用戶端和服務主控台視窗中選取 Enter 鍵以結束這兩個應用程式。
後續步驟
前進到下列教學課程: