MessageInterceptor 範例示範通道擴充性模型的用法。 尤其是,它展示了如何實作一個自訂綁定元素,以在運行時堆疊中的特定位置建立通道工廠和通道監聽器,從而攔截所有傳入和傳出訊息。 此範例也包含示範使用這些自定義處理站的用戶端和伺服器。
在此範例中,客戶端和服務都是控制台程式(.exe)。 客戶端與服務皆使用共用函式庫(.dll),其中包含自訂綁定元素及其相關的執行時物件。
備註
此範例的安裝程式和建置指示位於本主題結尾。
此範例說明使用通道架構和遵循 WCF 最佳做法,在 Windows Communication Foundation 中建立自定義分層通道的建議程式。 建立自訂分層通道的步驟如下:
決定通道處理站和通道接聽程式將支援的通道圖形。
建立支援通道圖形的通道處理站和通道接聽程式。
新增綁定項,將自定義分層通道新增至通道堆疊。
新增綁定項延伸區段,以將新的綁定項公開至組態系統。
通道圖形
撰寫自定義分層通道的第一個步驟是決定通道所需的圖形。 對於我們的訊息偵測器,我們支持我們下方圖層支援的任何圖形(例如,如果我們下方的圖層可以建置 IOutputChannel 和 IDuplexSessionChannel,我們也會公開 IOutputChannel 和 IDuplexSessionChannel)。
通道工廠和監聽器工廠
撰寫自定義分層通道的下一個步驟是為用戶端通道建立IChannelFactory實作,並為服務通道建立IChannelListener實作。
這些類別採用內部工廠和監聽器,並將除OnCreateChannel和OnAcceptChannel呼叫外的所有其他呼叫委派給內部工廠和監聽器。
class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
//...
}
class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{
//...
}
新增綁定項
此範例會定義自定義綁定項: InterceptingBindingElement。
InterceptingBindingElement將ChannelMessageInterceptor作為輸入,並使用此ChannelMessageInterceptor來處理通過它的訊息。 這是唯一必須是公用的類別。 工廠、監聽器和通道都可以是公開執行時介面的內部實作。
public class InterceptingBindingElement : BindingElement
{
}
新增組態支援
為了與系結組態整合,連結庫會將組態區段處理程式定義為綁定項延伸區段。 用戶端和伺服器組態檔必須向組態系統註冊綁定項延伸模組。 想要將其綁定項公開至組態系統的實作者可以衍生自這個類別。
public abstract class InterceptingElement : BindingElementExtensionElement
{
//...
}
新增政策
若要整合到政策系統中,InterceptingBindingElement 實作 IPolicyExportExtension,表示我們將參與政策的生成。 為了在已生成的用戶端上支援匯入原則,用戶可以註冊 InterceptingBindingElementImporter 的衍生類別並覆寫 CreateMessageInterceptor() 方法,以生成具備原則功能的 ChannelMessageInterceptor 類別。
範例:可卸除訊息偵測器
範例中包含了一個範例實作 ChannelMessageInspector ,會忽略訊息。
class DroppingServerElement : InterceptingElement
{
protected override ChannelMessageInterceptor CreateMessageInterceptor()
{
return new DroppingServerInterceptor();
}
}
您可以從設定存取它,如下所示:
<configuration>
...
<system.serviceModel>
...
<extensions>
<bindingElementExtensions>
<add name="droppingInterceptor"
type=
"Microsoft.ServiceModel.Samples.DroppingServerElement, library"/>
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
用戶端與伺服器皆使用此新建立的配置區段,將自訂工廠插入其執行時通道堆疊的最低層(高於傳輸層級)。
<customBinding>
<binding name="sampleBinding">
<droppingInterceptor/>
<httpTransport/>
</binding>
</customBinding>
客戶端使用 MessageInterceptor 庫來將自訂標頭新增至偶數號的訊息。 另一方面,服務會使用 MessageInterceptor 連結庫卸除任何沒有此特殊標頭的訊息。
執行服務和客戶端後,您應該會看到下列客戶端輸出。
Reporting the next 10 wind speed
100 kph
Server dropped a message.
90 kph
80 kph
Server dropped a message.
70 kph
60 kph
Server dropped a message.
50 kph
40 kph
Server dropped a message.
30 kph
20 kph
Server dropped a message.
10 kph
Press ENTER to shut down client
客戶向服務提供 10 種不同的風速,但只有其中一半被標記為特殊標頭。
在服務上,您應該會看到下列輸出:
Press ENTER to exit.
Dangerous wind detected! Reported speed (90) is greater than 64 kph.
Dangerous wind detected! Reported speed (70) is greater than 64 kph.
5 wind speed reports have been received.
要設定、建置和執行範例,請執行以下步驟:
請使用下列命令安裝 ASP.NET 4.0。
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable請確定您已針對 Windows Communication Foundation 範例 執行One-Time 安裝程式。
若要建置解決方案,請遵循 建置 Windows Communication Foundation 範例中的指示。
若要在單一或跨計算機組態中執行範例,請遵循執行 Windows Communication Foundation 範例 中的指示。
先執行 Service.exe 然後執行 Client.exe,並監看這兩個控制台窗口的輸出。