web-dev-qa-db-ja.com

IIS WCFサービスホスティングとWindowsサービス

WCFサービスを開発し、それを展開しようとしています。クライアントはbasicHttpBindingで使用しますが、社内チームはnamedPipesBindingで使用します。

IIS 7またはWindowsサービスでホストする方が良いかどうか疑問に思っています。いくつかのテストを実行しましたが、IISでバインディングを追加するときに、サービスの設定ファイルを更新します。これは、2つの異なる場所で設定を維持する必要があることを意味します。

StackOverflowでは、WCFサービスがHost in IIS(<baseAddresses>に関する WCFサービス構成ファイルの質問を参照してください

45
esylvestre

それらの質問に答えるには:

いくつかのテストを実行しましたが、IISにバインドを追加するときに、サービスの構成ファイルが更新されないことがわかりました。つまり、2つの異なる場所で構成を維持する必要があります。ロジックじゃないよね?

IIS=を使用してサービスをホストする場合、App.configファイルまたはweb.configファイルを構成して、IISを使用してバインディングを公開する必要があります。構成ファイル、wcfサービスに許可するすべてのバインディングを配置します。Http、net.tcpなど。

IISでアドレスを直接指定するため、バインディングではアドレスを指定しません。

IIS Webサイトの詳細設定で利用可能なバインディングを許可する必要があります。その後、Webサイト「Webサービス」に新しいバインディングを設定し、聴きたいすべてのバインディングを追加します。アドレスを指定します。

IISでアドレスを直接指定します。

例があります。

構成ファイル:

<services>
    <service name="ServiceName">                    
        <endpoint address=""
            binding="basicHttpBinding"
            bindingConfiguration="httpMode"
            contract="IContract" />                 
        <endpoint address=""
            binding="netTcpBinding"
            contract="IContract" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
</services>

あなたのIIS advenced設定であなたが置きます

有効なプロトコルのhttp、net.tcp

その後、バインディングをIISに入れます。 httpのバインディングを通常どおりに配置し、新しいバインディングnet.tcpを追加します。バインディング構成では、ポートと仮想ディレクトリを次のように配置します。

8001:*

この設定により、すべての仮想ディレクトリの8001ポートへのすべての接続が許可されます。

また、サーバーに「WCFアクティベーション(Httpアクティベーションおよび非HTTPアクティベーション)」機能をインストールする必要があります。

11
Cédric Boivin

IISでのホスティングには、多くの長所と短所があります。

はい、IISはオンデマンドのロードを提供します-これはプラスまたはマイナスになります。リクエストが到着すると、ServiceHostが構築され、ホストされているサービスクラスがインスタンス化され、 24時間稼働する必要はありませんが、同時に、このセットアップではメッセージが届くたびに多くの時間と労力が必要になり、プログラマーとしてのあなたはサービスホストをあまり制御できません。 。

はい、IISでは、*。svcファイルが存在する仮想ディレクトリがアドレスを定義します。構成内のベースアドレスまたは明示的に定義されたアドレスは無視されます。そして、多大な労力なしでは、サービスアドレスのレイアウトを変更することはできません-それらは常に http://servername/virtualdirectory/YourService.svc (.svc拡張子を含む)になります。

セルフホスティングは、ServiceHostが既に稼働しているため、多くの場合、より高速です。しかし、実際に稼働していることを確認するのはユーザー次第です。メッセージが着信するたびに「オンデマンド」ロードはありません。要求を処理できるかどうか。ただし、サービスホストをより詳細に制御できます。いつ、どのように構築されるかなど、サービスアドレスを選択して定義することができます。

個人的には、ほとんどの場合、セルフホスティングを使用することを選択します-テスト用のコンソールアプリ、実稼働用のNTサービス。私には、それがより適切な方法であり、より制御された方法でもあるように思えます。あなたはより多くの仕事をしなければなりません-しかし、あなたはあなたがしていることを正確に知っています。

マーク

76
marc_s

marc_sは通常、私が完全に同意する素晴らしい回答を提供しますが、この場合はそうではありません。
WCFのセルフホスティングは、特にMicrosoftによって間もなくリリースされるダブリンテクノロジーでは、良いアイデアではありません。 WCF(およびWF)アプリケーションの管理と操作は、IIS内でホストされると、はるかに簡単になります。

さらに、オンデマンドロードを取得します。

IIS7.5(WS2008 R2)には常時オンオプションがあります。

また、気になる場合は、.svcを省略するURL書き換えを簡単に行うことができます。

26
Cheeso

興味深いtidbit->このスレッドを読んだ後、MSDNでWindowsサービスを使用してWCFサービスをホストすることについて次の言葉に出会いました。

Windowsサービスの欠点のいくつかを次に示します。

展開:サービスは、.NET Framework Installutil.exeユーティリティを使用するか、インストーラーパッケージのカスタムアクションを使用してインストールする必要があります。
•機能の制限:Windowsサービスには、高可用性、管理の容易さ、バージョン管理、および展開シナリオをサポートするための、すぐに使用可能な機能のセットがまだあります。基本的に、カスタムコードを使用してこれらの要件を自分でカバーする必要があります。たとえば、IISはデフォルトでこれらの機能のいくつかを備えています。Windowsサービスは回復性とセキュリティ機能を追加しますが、それでも自分でいくつかの作業を行います。
http://msdn.Microsoft.com/en-us/library/bb332338.aspx

...および次のリンク:

ホスティングサービス: (素敵な比較表)
http://msdn.Microsoft.com/en-us/library/ms730158.aspx

16
atconway

この質問に対する標準的な答えはありません。 Cheesoの答えには完全に同意しません(WCFのセルフホスティングはお勧めできません)。

次のリンクを確認してください:( http://msdn.Microsoft.com/en-us/library/ms730158.aspxhttp://msdn.Microsoft.com/en-us /library/bb332338.aspx )そして、制約について考えます:

  • 手術システム
  • 期待される性能
  • 利用可能なハードウェア
  • 予想される可用性

多くの場合、「セルフホスティング」が最適な代替手段であることがわかります。

7
Rafa

IISは、アプリドメインの再読み込み、監視など、すぐに使用できる多くの機能を提供します。

このため、最初にこの質問に答える必要があります。この機能がすべて必要かどうか。そうでない場合-Windowsサービスを検討できます。

5

ここには選択された答えがありますが、Q/Aスレッドリンクの投稿を許可します。

IISでホストされているときにコードからWCFサービスを構成する方法

そこでの私の答え(およびその中のリンク)にあるのは、WServiceでロードする場合でもIISでロードする場合でも、サービスホストを細かく制御することです。

サービスの開始時に、IISバインディングに含まれているものをインターロゲートし、適切なエンドポイントを作成します。Microsoft.Web.Administration名前空間を通じてIIの構成を探します。

これが少し役立つことを願っています。

0
ChristoD