0

同じマシン上の別のWindowsサービスアプリケーションでホストしているWCFサービスでIIS6を確実に動作させようとしています。ユーザーはいくつかのHTTP公開サービスを介してIISに接続しますが、これは正常に機能しています。その後、IISはWindowsサービスからいくつかの情報を取得してHTTP応答を送信する必要があります。また、WindowsサービスとIISの間にコールバックチャネルが必要です。

多大な努力の結果、netTcpBindingで動作するようになり、すべてが5分または10分間バラ色になりましたが、その後、IISはWCFチャネルに障害があると報告し、ワーカープロセスがリサイクルされるまで、要求の処理を停止します。すべてが繰り返されました。

netNamedPipeBindingにスワップしようとしましたが、IISが拒否するか、「net.pipe:// localhost/mypipenameでリッスンしているエンドポイントがありませんでした」というエラーでパイプへのアクセスを拒否されました。コンソールアプリからパイプに正常に接続できます。

だから私の質問は、誰かがクライアントとしてIISで動作するこれらの2つのバインディングのいずれかを持っているか、または他のアプローチを持っているかということです。

4

3 に答える 3

2

net.tcp および net.pipe バインディングで約 20 のサービスをホストする IIS 7 を使用していますが、正常に動作しています。

パイプの問題は、私には設定ミスのように見えます。それが役立つ場合は、次のように構成します。

サーバ:

 <endpoint address ="" binding="fooBinding" 
           contract="Bla.IBlaAPI" 
           bindingConfiguration="BlaAPI.BindingConfig">

バインディング構成:

<binding name="BlaAPI.BindingConfig"
                 receiveTimeout = "10:50:00"
                 sendTimeout = "10:50:00"
                 maxReceivedMessageSize="2147483647"
                 maxBufferSize="2147483647"
                 maxBufferPoolSize="2147483647"
                 transactionFlow="false">
          <readerQuotas maxDepth="32"
                       maxStringContentLength="2147483647"
                       maxArrayLength="2147483647"
                       maxBytesPerRead="8192"
                       maxNameTableCharCount="2147483647" />
          <security mode="None"/>
</binding>

このサービスを介してデータの大きなチャンクを渡すため、長いタイムアウトを使用しており、メッセージ サイズなどのクォータが非常に高いことに注意してください。自分のニーズに合わせて調整できます。サービスはセキュリティで保護されたローカル マシンからのみ接続されるため、セキュリティは「なし」に設定されています。繰り返しますが、走行距離は異なる場合があります。

クライアント:

<endpoint name="Bla.Bindings.BlaAPI" address="net.pipe://localhost/bla/IBlaAPI.svc"
                behaviorConfiguration="BlaAPI.ServiceBehavior"
                binding="netNamedPipeBinding" bindingConfiguration="BlaAPI.BindingConfig"
                contract="Bla.IBlaAPI" />

Faulted 状態の問題については、サービス コードの実行中に未処理の例外が発生した場合、サービス インスタンスが適切に閉じられるまで、Faulted 状態のままになることに注意してください。これを回避するには、サービスのトップレベルで例外を処理するか、Enterprise Library Excexption Handling ブロックなどを使用します。

于 2009-11-10T12:28:18.947 に答える
1

Re NetNamedPipeBinding および「net.pipe://localhost/mypipename でリッスンしているエンドポイントがありませんでした」

Web アプリケーションがユーザーを偽装していませんか? 上記のエラーは、ログオン トークンが NETWORK USERS のメンバーシップを持つセキュリティ コンテキストで、名前付きパイプ バインドを介して WCF サービスにアクセスしようとすると発生するものです。WCF クライアント側チャネル スタックは、サービスによって作成された共有メモリ オブジェクトを読み取って、使用中のパイプの名前を公開しようとするときに、アクセス拒否エラーと "見つかりません" エラーを区別しません。( http://blogs.charteris.com/blogs/chrisdi/archive/2008/05.aspxなどを参照)

IIS アプリケーションの偽装トークンには、常に NETWORK USERS メンバーシップがあります。

于 2010-11-15T17:01:52.853 に答える
0

wcf クライアント プロキシを破棄するために使用するコードを教えていただけますか?

毎回正しく破棄されないため、wcf プロキシで「using」を使用しないでください。これにより、フォルト状態になる可能性があります。

于 2009-11-10T12:26:58.287 に答える