0

netTcp バインディングを備えた WCF サービスがあります。これは私の最初の WCF サービスであり、エンドポイントに問題があります。

開発段階での私の目標は、ポート フォワーディングを使用して開発マシンからサービスを公開することです。ポート 12345 で TCP をリッスンするように IIS7 の既定の Web サイトを構成し、必要なバインディングを作成しました。ファイアウォールでポートが開いており、ルーターでポートが転送されています。Net.TCP サービスはすべて実行されています。ここの記事で推奨されているすべての手順を実行したと思います。

しかし、サービスの IP アドレスで svc ファイルを使用して Visual Studio 10 でサービス参照を追加しようとすると、次のようなエンドポイントが作成され、ローカル ホスト名 (VULCAN) を指します。

<client>
    <endpoint address="net.tcp://vulcan:12345/CloudnetService/Dispatcher.svc"
        binding="netTcpBinding" bindingConfiguration="netTcpBinding_IDispatcher"
        contract="CloudnetService.IDispatcher" name="netTcpBinding_IDispatcher" />
</client>

これはもちろんローカルでは機能しますが、明らかにインターネット上では機能しません。

2 つ目の問題は、実装したサービスがローカルでは問題なく動作するものの、外部からは見えないことです。Telnet localhost 12345 がサービスを見つけます。Netstat は、ポートが TCP をリッスンしていることを示しています。しかし、IP とポートを Telnet で送信すると、「ポート 12345 でホストへの接続を開けませんでした: 接続に失敗しました」というメッセージが表示されます。

これは、web.config の system.serviceModel セクションです (---.---.-.-- は IP アドレスのプレースホルダーです)。

<bindings>

  <netTcpBinding>
    <binding name="netTcpBinding_IDispatcher"
        closeTimeout="00:01:00"
        openTimeout="00:01:00"
        receiveTimeout="00:10:00"
        sendTimeout="00:01:00"
        transactionFlow="false"
        hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="524288"
        maxReceivedMessageSize="65536">
      <readerQuotas
          maxDepth="32"
          maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession
        ordered="true"
        inactivityTimeout="00:10:00" />
      <security mode="None">
        <message 
          clientCredentialType="None" 
          algorithmSuite="Default" />
      </security>
    </binding>
  </netTcpBinding>

</bindings>

<services>

  <service name="Service.Dispatcher">

    <endpoint address=""
      binding="netTcpBinding"
      bindingConfiguration="netTcpBinding_IDispatcher"
      contract="Service.Interfaces.IDispatcher"
      name="netTcpBinding_IDispatcher">
    </endpoint>

    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://---.---.-.--:12345/CloudnetService"/>
      </baseAddresses>
    </host>      

  </service>

</services>

<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

<serviceHostingEnvironment multipleSiteBindingsEnabled="false" />

これに慣れていないので、私は非常に基本的な間違ったことをしていると確信しています!

よろしくお願いします。タオ

4

1 に答える 1

0

インターネットは TCP フレンドリーではないため、TCP ベースのインターネット接続は非常に困難です。ワイヤ上のファイアウォール/ルーターはトラフィックをブロックするだけであり、インターネットに飛び込む必要があるため、トラブルシューティングも困難です. したがって、通常、netTcp はイントラネットまたはローカルホストの使用に限定されます。

HTTP/HTTPS ベースのバインディングに固執する必要があります。

于 2012-08-02T03:40:16.343 に答える