次の方法で共有


NamedPipe のアクティブ化

NamedPipeActivation サンプルでは、Windows プロセス アクティブ化サービス (WAS) を使用して、名前付きパイプ経由で通信するサービスをアクティブ化するサービスをホストする方法を示します。 このサンプルは作業の 開始 に基づいており、Windows Vista を実行する必要があります。

このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。

サンプルの詳細

このサンプルは、Windows プロセス ライセンス認証サービス (WAS) によってアクティブ化されたワーカー プロセスでホストされるクライアント コンソール プログラム (.exe) とサービス ライブラリ (.dll) で構成されています。 クライアント アクティビティはコンソール ウィンドウに表示されます。

このサービスは、要求/応答通信パターンを定義するコントラクトを実装します。 コントラクトは、次のサンプル コードに示すように、算術演算 (加算、減算、乗算、除算) を公開する ICalculator インターフェイスによって定義されます。

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
}

クライアントは特定の算術演算に対して同期要求を行い、サービス実装は適切な結果を計算して返します。

// Service class that implements the service contract.
public class CalculatorService : ICalculator
{
    public double Add(double n1, double n2)
    {
        return n1 + n2;
    }
    public double Subtract(double n1, double n2)
    {
        return n1 - n2;
    }
    public double Multiply(double n1, double n2)
    {
        return n1 * n2;
    }
    public double Divide(double n1, double n2)
    {
        return n1 / n2;
    }
}

このサンプルでは、セキュリティなしで変更された netNamedPipeBinding バインドを使用します。 バインディングは、クライアントとサービスの構成ファイルで指定されます。 サービスのバインドの種類は、次のサンプル構成に示すように、エンドポイント要素の binding 属性で指定されます。

セキュリティで保護された名前付きパイプ バインドを使用する場合は、サーバーのセキュリティ モードを目的のセキュリティ設定に変更し、クライアントで svcutil.exe をもう一度実行して、更新されたクライアント構成ファイルを取得します。

<system.serviceModel>
        <services>
            <service name="Microsoft.ServiceModel.Samples.CalculatorService"
               behaviorConfiguration="CalculatorServiceBehavior">

        <!-- This endpoint is exposed at the base address provided by host: net.pipe://localhost/servicemodelsamples/service.svc  -->
        <endpoint address=""
                  binding="netNamedPipeBinding"
                  bindingConfiguration="Binding1"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
        <!-- the mex endpoint is exposed at net.pipe://localhost/servicemodelsamples/service.svc/mex -->
        <endpoint address="mex"
                  binding="mexNamedPipeBinding"
                  contract="IMetadataExchange" />
      </service>
        </services>
        <bindings>
            <netNamedPipeBinding>
                <binding name="Binding1" >
                    <security mode = "None">
                    </security>
                </binding >
            </netNamedPipeBinding>
        </bindings>

    <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceMetadata />
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>

クライアントのエンドポイント情報は、次のサンプル コードに示すように構成されます。

<system.serviceModel>

    <client>
      <endpoint name=""
                          address="net.pipe://localhost/servicemodelsamples/service.svc"
                          binding="netNamedPipeBinding"
                          bindingConfiguration="Binding1"
                          contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </client>

    <bindings>

      <!--  Following is the expanded configuration section for a NetNamedPipeBinding.
            Each property is configured with the default value. -->

      <netNamedPipeBinding>
        <binding name="Binding1"
                         maxBufferSize="65536"
                         maxConnections="10">
          <security mode = "None">
          </security>
        </binding >

      </netNamedPipeBinding>
    </bindings>

  </system.serviceModel>

サンプルを実行すると、操作要求と応答がクライアント コンソール ウィンドウに表示されます。 クライアント ウィンドウで Enter キーを押して、クライアントをシャットダウンします。

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

サンプルを設定、ビルド、実行するには

  1. IIS 7.0 がインストールされていることを確認します。 WAS ライセンス認証には IIS 7.0 が必要です。

  2. Windows Communication Foundation サンプルのOne-Time セットアップ手順を実行していることを確認します。

    さらに、WCF 非 HTTP アクティブ化コンポーネントをインストールする必要があります。

    1. [スタート] メニューの [コントロール パネル] を選択します。

    2. [ プログラムと機能] を選択します。

    3. [ Windows コンポーネントのオンとオフを切り替える] をクリックします

    4. Microsoft .NET Framework 3.0 ノードを展開し、Windows Communication Foundation の非 HTTP アクティブ化機能を確認します。

  3. 名前付きパイプのアクティブ化をサポートするように Windows プロセス ライセンス認証サービス (WAS) を構成します。

    便宜上、次の 2 つの手順は、サンプル ディレクトリにある AddNetPipeSiteBinding.cmd という名前のバッチ ファイルに実装されます。

    1. net.pipe のアクティブ化をサポートするには、既定の Web サイトを最初に net.pipe プロトコルにバインドする必要があります。 これは、IIS 7.0 管理ツールセットと共にインストールされている appcmd.exeを使用して行うことができます。 管理者特権コマンド プロンプトから、次のコマンドを実行します。

      %windir%\system32\inetsrv\appcmd.exe set site "Default Web Site"
      -+bindings.[protocol='net.pipe',bindingInformation='*']
      

      このコマンドは 1 行のテキストです。

      このコマンドは、net.pipe サイト バインドを既定の Web サイトに追加します。

    2. サイト内のすべてのアプリケーションは共通の net.pipe バインドを共有しますが、各アプリケーションで net.pipe のサポートを個別に有効にすることができます。 /servicemodelsamples アプリケーションの net.pipe を有効にするには、管理者特権のコマンド プロンプトから次のコマンドを実行します。

      %windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http,net.pipe
      

      このコマンドは 1 行のテキストです。

      このコマンドを使用すると、 http://localhost/servicemodelsamplesnet.tcp://localhost/servicemodelsamplesの両方を使用して/servicemodelsamples アプリケーションにアクセスできます。

  4. ソリューションの C# または Visual Basic .NET エディションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。

  5. このサンプル用に追加した net.pipe サイト バインドを削除します。

    便宜上、次の 2 つの手順は、サンプル ディレクトリにある RemoveNetPipeSiteBinding.cmd という名前のバッチ ファイルに実装されます。

    1. 管理者特権でのコマンド プロンプトから次のコマンドを実行して、有効なプロトコルの一覧から net.tcp を削除します。

      %windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http
      

      このコマンドは、1 行のテキストとして入力する必要があります。

    2. 管理者特権でのコマンド プロンプトから次のコマンドを実行して、net.tcp サイト バインドを削除します。

      %windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" --bindings.[protocol='net.pipe',bindingInformation='*']
      

      このコマンドは、1 行のテキストとして入力する必要があります。

こちらも参照ください