tcp接続で暗号化のレベルをMessage,Transport(デフォルト)で変更し、メッセージの内容がどのように変わるかを確認しています。

確認環境は次のとおりです。

  • Windows Vista (WCFサービス,クライアント同じOS)
  • 開発環境 Visual Studio 2008 Professional
  • .NET 3.5

1.ソリューションの作成と構成の変更

空のソリューションを作成し、 WCFサンプル再作成(ブラッシュアップ) からプロジェクトコピーして追加。ソリューションを右クリック→[Properties]を選択し、プロパティダイアログで、
Multiple StartupにWCFSample.ConsoleClient,WCFSample.WPHHostを設定(下図)。 

WPFHostプロジェクトのWCFサービスの構成を変更します(以下の記述参照)。バインディングをnetTcpBindingに変更しています。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="AdventureWorksConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=AdventureWorks;User ID=【ユーザID】;Password=【パスワード】"/>
  </connectionStrings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="WCFSample.ProductService.ProductService" behaviorConfiguration="ProductServiceBehavior">
        <endpoint address="net.tcp://localhost:8056/ProductService" binding="netTcpBinding"
          bindingConfiguration="" contract="WCFSample.ProductService.IProductService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ProductServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

ConsoleClientプロジェクトのWCFクライアントの構成を変更します。(以下の記述参照)。バインディングをnetTcpBindingに変更しています。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="net.tcp://localhost:8056/ProductService" binding="netTcpBinding"
          bindingConfiguration="" contract="WCFSample.Client.Proxy.ProductService"
          name="BasicHttpBinding_ProductService" />
    </client>
    <bindings>
    </bindings>
  </system.serviceModel>
</configuration>

 プロキスクラスを再作成する必要はありません。この状態で動作することを確認します。

2.メッセージログ出力の設定

WPFHostのapp.configをWCF Configuration Editorで編集します。

ConfigurationのDiagnosticsを展開し、Message Logginを選択。Message LoggingのLogEntireMessage, LogMessagesAtServiceLevel, LogMessagesAtTransportLevelをTrueに変更します(下記参照)。

Sourcesフォルダを右クリック→[New Source]を選択。TraceSourceのNameにSystem.ServiceModel.MessageLoggingを選択,Trace levelにVerboseを選択します。

Listenersフォルダを右クリック→[New Listener]を選択。TraceListenerのNameプロパティをMessageLogにし、InitDataプロパティの右のボタンをクリックし、ログの出力先を選択する。TypeNameがXmlWriterTraceListenerであることを確認し、下段のAddボタンを押してSourceにSystem.ServiceModel.MessageLogging選択する(下図)。

上書き保存で終了します。

 3.トレースの実行と結果の確認

ソリューションをデバッグ実行します。

デバッグ実行終了後、[スタートメニュー]→[All Programs]→[Microsoft Windows SDK]→[Tools]からService Trac Viewer選択して、実行します。Service Trace Viewerのメニュー[File]→[Open]で出力されたログを開きます。

左側のペインのMessageタブを選択します。Action名でサービスメソッドの種類がわかります。例として、GetProductIDsResponse(GetProductIDsの結果)のActionを選択するし、右下のペインのMessageタブを選択して、メッセージを確認すると、Message,Transportレベルのログがともに暗号化されていないまま表示されることが確認できます。(netTcpBindingはデフォルトでTransportLevel暗号化をするため、Message,Transportログ出力時点でBodyが暗号化されていない)

4.暗号化をTransportLevel→MessageLevelに変更してトレースログの確認

WPFHostのApp.configをService Configuration Editorで編集します。

Bindingsフォルダを右クリック→[New Binding Configuration]を選択。Nameを"TcpBindingConfiguration",Securityタブを選択肢、ModeをTransportからMessageに変更します(下図参照)。

[Services]→[Endpoints]と展開し、Empty Nameを選択,bindingConfugurationにTcpBindingConfigurationを選択する(下図参照)。

 

 

ConsoleClientも同様に構成を変更するが、WPFHostの構成をコピーしたほうがはやいので、bindingsタグの中身をコピーし、clientタグのendpointのbindingConfigurationをTcpBindingConfigurationにセットします。
結果は以下のようになります。bindingsタグが追加され、endpointのbindingConfigurationにTcpBindingConfigurationを設定しています。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="net.tcp://localhost:8056/ProductService" binding="netTcpBinding"
          bindingConfiguration="TcpBindingConfiguration" contract="WCFSample.Client.Proxy.ProductService"
          name="BasicHttpBinding_ProductService" />
    </client>
    <bindings>
      <netTcpBinding>
        <binding name="TcpBindingConfiguration">
          <security mode="Message" />
        </binding>
      </netTcpBinding>
      </bindings>
  </system.serviceModel>
</configuration>

編集完了後、トレースログをいったん削除し、再びデバッグ実行して、Service Trace Viewerで中身を確認します。

下図はGetProductsIDsのレスポンスのメッセージレベルのトレースログです。右下のペインでBodyの内容が暗号化されていないことが確認できます。

下図は同じGetProductIDsのレスポンスのトランスポートレベルのトレースログです。右下のペインでメッセージのBodyの中身が暗号化されていることが確認できます。

以上で終了です。間違いがありましたらご指摘ください。