4

最近 Azure Web ロールに移行した C# MVC4 アプリケーションがあります。Azure プラットフォームで問題なくサイトを公開/実行できますが、Azure 開発ファブリックを使用してローカルで実行しようとすると、IIS と IIS Express が一般的な 403 エラーをスローします。

多数の投稿で言及されているのを見たので、web.configに次を追加しようとしましたが、役に立ちませんでした。このソリューションは、管理されたパイプラインを介してすべてのリクエストを実行しているため、とにかく大ハンマーのアプローチのように思えますが、それでも、試してみることにしました。

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"></modules>
    <handlers>
      <remove name="UrlRoutingHandler"/>
    </handlers>
  </system.webServer>

アプリケーションルートの「robots.txt」ファイルにアクセスできることを確認したため、サーバーが起動して正しい場所を指していますが、MVC ページはまったく提供されません。

この SO answerの解決策も試しました。そこにもサイコロはありません。

また、Azure Web ロールを IIS Express ではなく IIS で実行するように切り替えてみました。そこでも同じ 403 エラーが発生します。徹底するために、自分のマシンでローカル (Azure 以外) で実行されている他の MVC アプリが正常に動作していても、aspnet_regiis -irを実行しました。

編集 これは興味深いです... F5 キーを押すと (私の Azure プロジェクトは私のスタートアップ プロジェクトです)、Azure コンピューティング/ストレージ エミュレーターが起動し、ブラウザーが開きますhttp://127.0.0.1:81/。これは、403 エラーが発生する URL です。

ただし、(Express ではなく) IIS を使用していて、デプロイ時に Azure によって作成された IIS の Web サイトにアクセスし、[Web サイトの管理] を右クリックして [参照] を選択すると、http://localhost:82/. 127.0.0.1 の代わりに「localhost」と 81 の代わりに 82 のポートに注意してくださいサイトを問題なく閲覧でき、ブレークポイントにヒットするなどします。http://127.0.0.1:82(IP を使用してポート 82 を使用して) 試してみると、まだ 403 が表示されます。

何か案は?

4

1 に答える 1

1

あなたが尋ねている正確な質問を得ることができませんでしたが、あなたのサイトがこのように振る舞う理由を説明することができます (私たちのプロジェクトでは非常によく似た振る舞いをしています)。この動作の 100% 正しい説明であるかどうかはわかりませんが、私の知る限り: 1. IIS と IIS Express は同じポートを同時に使用することはできません。2. 独自のスタック\ロード バランシング プロキシを実行している Azure コンピューティング エミュレーター (複数インスタンスの Azure 環境をエミュレートするため) であり、ポートに自身を登録する必要があります。

では、なぜこのようなことが起こるのか:おそらく、IIS にポート 80 を使用する他のサイトがいくつかあります。したがって、エミュレーターを起動すると、ポート 80 が使用できないことがわかります (動作中の iis によってロックされているため)。バインドする次の空きポートが見つかるまで、ポート ウォーキングを開始します (ここでは 81 と 444 になります)。F5 を起動した後に一般出力ウィンドウを確認すると、同様のメッセージが表示されます。

Windows Azure Tools: Warning: Remapping public port 80 to 81 to avoid conflict during emulation.
Windows Azure Tools: Warning: Remapping public port 443 to 444 to avoid conflict during emulation.
Windows Azure Tools: Warning: Remapping private port 80 to 82 in role 'MvcApplication' to avoid conflict during emulation.
Windows Azure Tools: Warning: Remapping private port 443 to 446 in role 'MvcApplication' to avoid conflict during emulation.

そのため、エミュレーターは負荷分散エンドポイントをパブリック ポート 81\444 に登録し、ある種の内部エンドポイントを 82\446 に公開しました。しかし、'127.0.0.1' と 'localhost' の動作が少し異なると思われます (同じことはわかっています。IP URL が少し異なるパイプラインを通過するのではないかと疑っているだけですが、推測を確認することはできません)。特に、1 つのロールに複数のサイトがある場合 - 127.0.0.1 は適切なエンドポイントにアクセスできません (適切なホスト ヘッダーが含まれていない可能性があります)。

これにより、localhost:444 (この場合) が正しく機能し、127.0.0.1:444 が機能しないという状況が発生します。

この回答は、それを修正/処理する方法のいくつかのオプションにつながる可能性もあります。

少しでもお役に立てば幸いです

于 2013-05-13T02:53:07.573 に答える