5

私はこのチュートリアルに従いました(少なくともこれに基づいて、同じように作業する必要があります): http ://www.eggheadcafe.com/tutorials/wcf/b5ada8df-58c5-492f-b368-457b3a4f137c/notify-client-アプリケーション-using-wcf-callbacks.aspx

私のコンピューターでは非常にうまく機能していますが、インターネット経由で使用する必要があります。これを行おうとしているときに、netTcpBidingを使用する方が良いと(インターネット経由で)聞いた。

オンラインのクライアント数を認識するサーバーを用意します。サーバーのIISでWFCサービスを使用し、Windowsサービスがそれを使用して通知する必要がありました。サーバーがクライアントでいくつかのコマンドを実行できるようにする必要がある場合は、コールバックが必要です。

誰かが私を助けてくれたらとても嬉しいです。

前もって感謝します、

編集:

自分自身を明確にする:私はそれをインターネット上で機能させることができませんでした。netTcpBindingを使用してインターネット上で動作するように構成(Web.config e App.config)を変更する方法を教えてもらえますか?

再度、感謝します、

編集2:

WCFServiceApplicationのWeb.configは次のとおりです。

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="WSDualHttpBinding_IPCWatcherWCFService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
            maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" />
          <security mode="Message">
            <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" />
          </security>
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior" name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFService">
        <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService" contract="TiT.PCWatcher.Server.WCFService.Interfaces.IPCWatcherWCFService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="TiT.PCWatcher.Server.WCFService.Services.PCWatcherWCFServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

WindowsServiceのApp.configは次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="WSDualHttpBinding_IPCWatcherWCFService" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
          maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
          textEncoding="utf-8" useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" />
          <security mode="Message">
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" />
          </security>
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:25145/Services/PCWatcherWCFService.svc"
        binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IPCWatcherWCFService"
        contract="PCWatcherWCFServiceReference.IPCWatcherWCFService"
        name="WSDualHttpBinding_IPCWatcherWCFService">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

netTcpBindingに変更するだけでは機能しません...

しかし、これをインターネット上で実行できることを嬉しく思います...私はIISでWCFServiceを公開しました。リンク:

https://www2.tcenter.com.br/monitor/PCWatcherWCFService.svc

また

http://www2.tcenter.com.br:8080/monitor/PCWatcherWCFService.svc

設定を変更するだけで、インターネット経由で機能するようになりますか?私が言ったように、ローカルでは問題なく動作します。

クライアントのエンドポイントアドレスを上記のURLのいずれかに変更するだけでうまくいくと思いましたが、うまくいきませんでした...

リンクした例は、WPFでサービスをホストします。それが私の風景に当てはまるかどうかはわかりません...

DualHttpBindingを使い続けるつもりだと思いますが、ポートフォワーディングが私のニーズに適しているとは思わないでしょう。1つのイントラネットに多数のクライアントを配置し、ルーターに情報を送信するクライアントを決定させることができます。それは良くないですよね?または、同じポートを介してWebサーバーに接続しているすべてのマシンにルーターが正しく応答するようにする方法はありますか?!(ただ尋ねる、hehehe)

よろしくお願いします、

2012年6月21日に編集:

読んでくれてありがとう。LANのnetTcpBindingでサービスを動作させることができませんでした。私は自分のシーナリオの模擬サンプルを作成しました。ここにあります。DualCommunicationTestと呼ばれます。

この投稿を始めたとき、私はこのセナリオンをインターネット上で実行する方法を知りたかっただけです。それだけ。ここに投稿する前に解決策を探していたときに、netTcpBindingの方が優れていることを読みました。それで私はそれについて尋ねました。それは単なる副次的な質問でした。

だから...私の現在の投稿のニーズは次のとおりです。

インターネットで開発したサンプルの使い方。

また

が開発したサンプルをnetTcpBindingで動作させ、インターネットで使用できるようにする方法。(Clunky Coderが、IISなどを使用してインターネット上でnet.tcpを公開する方法について、第2部を教えてくれたと確信しています。ありがとうございましたが、テストできなかったため、まだテストできませんでした。まだnetTcpを実行していません。)

よくわからなくてごめんなさい、私の英語はあまり上手ではありません。どうもありがとうございました。

4

2 に答える 2

5

netTcpBindingデュプレックス通信(コールバックとの通信)WSDualHttpBindingに適しています。また、HTTPを介したデュプレックス通信に推奨されるバインディングよりもパフォーマンスが高くなります。netTcpBindingただし、技術的には可能であり、機能する可能性はありますが、実際にはインターネット経由で使用するべきではありませんが、使用するポートnetTcpBindingはインターネット上のファイアウォールによってブロックされている可能性があります(通常はブロックされています)。インターネットを介して何かを送信すると、多くのホップが発生し、多くのルーターとファイアウォールを通過します。これらのルーターとファイアウォールですべてのポートが開いているという保証はありません。ただし、クライアントエンドポイントとサーバーエンドポイントの両方でポート(netTcpの場合はTCP 808)を開くことができれば(通常はルーターのポート転送によって実行されます)、機能する可能性がありますが、一般的なアドバイスは使用しないことです。netTcpBindingインターネット経由。私はそれを私のサービスに数回使用しました、そして私のクライアントは問題なくインターネット上でサービスを利用することができました-私がクライアントとサーバーの両方の端のポートを転送した後。

一般に、インターネットを介した二重通信にはWSDualHttpBindingがあり、Silverlightクライアント(Silverlightはサポートしていません)を使用している場合は、PollingDuplexHttpBindingWSDualHttpBinding使用できます

また、これを読むことをお勧めします。

編集:

その例を使用するようnetTcpBindingに変更するには、構成ファイルのバインディングを変更して、のnetTcpBinding代わりに使用しますwsDualHttpBindingこの記事を見てください、それはあなたが投稿したリンクがすることをします、netTcpBindingそしてより多くの説明。

2012年6月20日編集:

自分自身を明確にする:私はそれをインターネット上で機能させることができませんでした。netTcpBindingを使用してインターネット上で動作するように構成(Web.config e App.config)を変更する方法を教えてもらえますか?

LANでサービスを使用できるようにnetTcpBindingなったようです。以前の問題は修正され、IISでサービスをホストしてオンラインで公開するのに問題が発生しています。サービスがLANで機能する場合、IISでホストし、クライアントとサーバールーターの適切なポートを転送すると、インターネット上で機能します。これは一般的なシナリオであり、オンラインで十分に文書化されています。これを行うには、IISWebサイトでアプリケーションとしてサービスをホストする必要があります。サービスにサービスの場所を指す.svcファイルがあることを確認してから、App.Config(サービス構成ファイル)の内容を新しいweb.config(アプリと同じ物理ディレクトリ内)にコピーする必要があります。 .config)そしてまた削除します<host><baseAddresses>新しく作成されたweb.configのセクションで、アプリケーションの物理パスをサービスホストコンピューター上のこのサービスの場所にポイントします。それが済んだら、必ずデフォルトのWebサイトバインディングを編集して、サービスが使用する特定のバインディングを有効にしてくださいnetTcpBinding。[Webサイト]->[バインディングの編集...]->[追加...]に移動し、[ネット]を選択します。 tcpを実行し、ポートを割り当てます。次に、アプリケーションで[詳細設定]に移動し、net.tcpを有効にします。netTcpBinding通常、サービスはhttp,net.tcp有効なプロトコルとして使用されます。歯が生えるエラーが発生した場合は、デフォルトのアプリプール(またはWebサイトが使用しているアプリケーションプール)に、サービスが存在するサーバー上の物理ディレクトリにアクセスして読み取るために必要なアクセス許可があることを確認してください。

これこれを読んでください、私に詳しく説明するように頼むことは彼らが言っていることを繰り返すだけです。

2012年6月21日編集:

サービスをダウンロードしてIISでホストしましたが、nettcpではなくHTTPを使用しているため、インターネット上で完全に正常に機能するため、正常にホストされています。あなたのサービスが単純なものであり、それを使って重い処理を行うことを期待していない場合(その見た目では、接続されているクライアントのリストを取得しようとしているだけです)wsDualHTTPBinding、HTTPプロトコルはどのサービスでも機能するため、これを使用してください環境であり、ファイアウォールについて心配する必要はありませんnetTcpBinding。これは、IISでサービスをホストする(そしてインターネット経由で利用できるようにする)ために私が行ったすべてのことです。

  1. IISのDefaultWebsiteに移動し、右クリックしてアプリケーションを追加します。[エイリアス]で、URLに表示したい名前をサービスに付けます。[既定のアプリプール]または[ASP.NET4.0アプリプール]を選択します。

  2. .svcファイルがコンピューター上にある場所への物理パスを指定します。私にとっては:

C:\Users\MyPC\Documents\DualCommunicationTest.Server\WcfServiceApp

  1. 有効なプロトコルでは、ポート80またはその他のポート(8085など)にHTTPがあることを確認しますが、ルーターのこのポートをサービスホストコンピューターに転送する必要があります。サービスホストがLANのIP192.168.1.4上にある場合は、ルーター上でポート80(または使用する任意のポート-たとえば8085)をコンピューター192.168.1.4に転送します。

そして、それはとても簡単です。

于 2012-06-18T13:14:06.473 に答える
1

TCPは本質的に双方向であるため、インターネットを介したコールバックにはTCPバインディングの方が適しています。HTTPはリクエストであり、一方向のみです。したがって、dualHttpBindingのデュアル。WCFは、サービスがクライアントに要求を送信できるように、クライアントに戻る2番目のHTTP接続を作成する必要があります。

インターネットは、サーバーがHTTP経由でコールバックするように実際には設定されていません。ルーターによって実行されるNATのようなものは、HTTP要求を適切にルーティングするためにポートを転送する必要があり、クライアントがHTTPサーバーを実行している必要があることを意味します。

したがって、TCPを使用する方がはるかに簡単です。それか、場合によっては、サーバー側からストリーミングされる応答オブジェクト(実際には終了しない応答)をクライアントに要求させて、サーバーが通知を送信できるようにします。しかし、これは簡単ではありません。

于 2012-06-18T12:48:02.920 に答える