Windows Azure プロジェクトで一部の構成設定をオンザフライで変更する必要があります。また、Web サービス呼び出しを介して変更する必要があります (プラットフォーム API または Azure 管理サイトを介してアプリケーションの構成を更新することは、ここではオプションではありません)。 )。
プロジェクトには複数の Web ロールと worker ロールがあります。新しい構成が変更された場合、そのすべてが新しい構成を認識する必要があります。
構成は耐久性のあるストレージに保持され、実行時に静的変数にキャッシュされます。
私の解決策は、ロールに内部 (tcp) エンドポイントを作成し、それを使用してすべてのロールとそれらのロール内のインスタンスをループし、その場でクライアントを作成し、インスタンスに新しい設定を伝えることでした。( http://msdn.microsoft.com/en-us/gg457891とほぼ同じ)
最初に、WebRole の RoleEntryPoint で ServiceHost を開始しました...そして、通信 (正しく設定された静的変数) をステップ実行したときにすべてが正常に機能しているように見える理由に混乱しましたが、他の Web サービス呼び出しを行うと、静的変数は、私が設定したものを「忘れた」ようです。
これは、ローカルでも Azure ステージング環境でも同様でした。
この時点で、フル IIS モードを使用しているため、RoleEntryPoint と Web サービスが 2 つの別個のプロセスで実行されていることに気付きました。1 つは Azure のスタブ、もう 1 つは IIS です。
「問題ありません」と私は言いました。ServiceHost を開始するコード行を RoleEntryPoint から global.asax に移動するだけです。この時点で、ServiceHost はサイトの残りの部分と同じプロセスで開始されます。静的変数は同じものになります。
ここで問題が発生します。これは、開発環境で実行されているローカル マシンでうまく機能します。ステージングにデプロイするとすぐに、「障害状態」にあるため、サービスへの接続に使用されるチャネルを閉じることができないというエラー メールが届き始めます。
質問:
- これを引き起こしている Azure と Dev 環境の違いは何ですか?
- 問題を修正または回避するにはどうすればよいですか?
- より説明的なエラーを取得する方法について、一般的なアドバイスはありますか?これを取得するには、Azure で完全な wcf 診断を有効にする必要がありますか?それとも、例外の詳細を取得できる他の方法がありますか?
ファローアップ:
リモート デスクトップを介して、いくつかの興味深いことを学びました。
非 HTTP アクティベーションは、既定では Azure WebRoles にインストールされません。これは、起動スクリプトを介して克服できると思います。
start /w pkgmgr /iu:WCF-NonHTTP-Activation;
IIS で Web ロールによって作成された Web サイトでは、net.tcp プロトコルが既定で有効になっていません。また、これは起動スクリプトで克服できると思います。
%systemroot%\system32\inetsrv\appcmd.exe set app "Website Name Here" /enabledProtocols:https,http,net.tcp
締め切りにより、いくつかの回避策を一時的に実装する必要があったため、これを最後まで実行する時間がありませんでした。
このトピックに関連する便利なリンク:
http://msdn.microsoft.com/en-us/magazine/cc163357.aspx
http://forums.iis.net/t/1160443.aspx