1

最近、ポート2993でTCPパケットを受け入れることになっているステージング環境にAzureアプリをデプロイしました。Azureエミュレーターで実行すると、これは非常にうまく機能し、正常に動作します。

ただし、Azureのステージングサーバー上にあるため、TCPポートに接続しようとすると、次のSocketExceptionが発生します。

接続されたパーティが一定時間後に適切に応答しなかったために接続の試行が失敗したか、接続されたホストが応答しなかったために確立された接続が失敗しました。

私のWebアプリには2つのインスタンスがあります。1つはワーカーロール(エンドポイントで2993が構成されています)とWebロール(ポート80のみ)です。ちなみに、ポート80は完全に機能します。Webアプリは、C#のVisualStudioで作成されました。なぜこれが起こっているのですか、どうすれば修正できますか?

すべての助けは大歓迎です。

4

2 に答える 2

0

問題の内容と、上記のコードを追加してこの問題を解決し、他の人の利益になる理由を説明したいと思います。

worker ロールでは、任意の TCP エンドポイントと任意のポート番号を構成します。この VM が起動すると、VM はこのポートを使用するようにプロビジョニングされ、このポートへのアクセスを提供するための例外としてファイアウォールが含まれます。Azure VM を起動する準備が整うまでに、TCP/IP アドレスが既にあり、構成されたポートが有効になっています。

役割が開始され、このポートにアクセスする必要があるサービスまたはアプリケーションがある場合は、本当に必要です。

たとえば、ワーカー ロールで Tomcat/Java を構成している場合、構成済みのポートに TCP リスナーを作成する必要があります。これは、ワーカー ロールが次のように開始されたときに実行できます。

  1. 現在のロール インスタンスの IP アドレスとポート番号を取得する
  2. TCP リスナーを作成し、この IP アドレスとポートから開始します
  3. ステップ 1) と 2) を実行するコードをワーカー ロールの OnStart() 関数に追加します。

コードは次のようになります。

TcpListener TomcatPortListener = new  TcpListener(RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["TomcatWeb80"].IPEndpoint);
TomcatPortListener.Start();

あなたの場合、IPアドレスとポート番号を取得したのとまったく同じことを行い、IP /ポートを使用してソケットアドレスからエンドポイントを作成しました。

RoleInstanceEndpoint externalEndPoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["TCPin"];
IPEndPoint localEndPoint = new IPEndPoint(externalEndPoint.IPEndpoint.Address, externalEndPoint.IPEndpoint.Port);
localEndPoint.Create();

これは、TCP エンドポイントを作成する Web ロールまたはワーカー ロールの必須設定です。

于 2012-05-18T05:43:27.130 に答える
0

この問題は、プログラムがサーバーの IP アドレスを検出したことに関係しているようです。代わりに次のサーバー コードを使用することで、問題を解決できました。

RoleInstanceEndpoint externalEndPoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["TCPin"];
        IPEndPoint localEndPoint = new IPEndPoint(externalEndPoint.IPEndpoint.Address, externalEndPoint.IPEndpoint.Port);

その後、IPEndpoint を tcpListener ソケットで使用できます。

于 2012-05-18T03:15:47.730 に答える