2011-07-16 7 views
6

私は既存のアプリをAzureに移行しようとしています。あるWebロールにはMVCアプリが、別のWebロールにはいくつかのWCFサービスがあります。ライブの場合、サイトはhttp://www.myapp.comになり、サービスはhttp://api.myapp.comになり、MVCアプリはhttp://api.myapp.comのサービスを指すように設定されます。Azure - 段階でサービスウェブの役割のURLを動的に発見する

問題は、Azureの「ステージ」設定にアプリをプッシュするときです。私が理解していることは、それぞれの舞台への押し上げによって、サービスは新しいURL(http://4aa5ae2071324585ba5a902f4242a98c.cloudapp.net/のようなランダムなURL)に生きることになります。この場合、私のMVCアプリケーションがサービスのURLを発見する最良の方法は何ですか?

1つのオプションは、http://stage.api.myapp.comのようなdnsエントリを設定し、ステージにプッシュするたびに新しいAzureステージングURLを指すようにDNS CNAMEレコードを更新することです。

もう1つの選択肢は、ステージング、サービスの新しいURLの取得、MVCの各インスタンスへのRDCの取得、手動による設定の更新です。また、うんざり。

これを行う簡単な方法はありますか?上記の手順のいくつかをPowerShellのようなもので自動化できることは分かっていますが、これを簡単にするAzureフレームワークに焼き込まれたものが本当にあることを期待しています。このような標準的なシナリオのようです。

答えて

6

ステージングURLの内容を動的に検出する唯一の方法は、インスタンスに独自のdeploymentIDをチェックさせることです。ここでは、MVC WebサイトとWCFサービスが同じ展開にあると仮定しています。 RoleEnvironment.DeploymentIDを確認すると、ステージングで使用される「ランダム」URL(つまりhttp:// [deploymentID] .cloudapp.net)と正確に一致することがわかります。

クライアント側でChannelFactoryを動的に作成している限り、独自のDeploymentIDを取得してステージングURLを見つけることができるはずです。

もちろん、ステージングで展開する場合にのみ有効です。プロダクションスロットを使用してみませんか?その名前は安定しており、あなたはそれに頼ることができます。あなたはいつも複数のホストされたサービス(dev、QA、prodなど)を持ち、それらの製品スロットだけを使用することができます。

+2

これは良いことではありません。ロール間の通信には、この目的のためだけに存在するエンドポイントを使用する必要があります。申し訳ありませんが、私はダウン投票しましたが、あなたが提案しているようにこれをしないことが重要であると本当に感じています。 –

+2

私はあなたが質問を逃したように感じる。ステージングスロットを動的に発見する方法でした。たった2つの方法(私が概説し、mgmt APIを使用する方法)があります - これはすべて私が答えたものです。可能であればinterrole commを使用することは良いアイデアだとは同意見ではありませんが、実際にはLoad Balancerアドレスを使用する必要があり、彼は明確にしませんでした。 – dunnry

+0

私はあなたが何を意味しているのか理解していますが、答えが正しいことではないことがあります。私が意味するところは、プロセッサとマザーボードを一緒にテープで貼り付ける方法を尋ねると、あなたは私に教えてくれますか、それとも、私はそれをそこに置いて、すでに実装されているメカニズムでピン止めすることができると教えてくれますか? DeploymentIdは "虐待"されるべきではありません。本当に答えを感じています(間違いありません!)なぜあなたが何をやっているかを絶対に知っておらず、他のすべてのオプションを使用していない限り、また、外部エンドポイントを使用している場合は、トラフィックを支払う必要があります。 –

4

@dunnryが示唆していることをしないでください! Azureはあなたの問題を解決する本当に良いエンドポイントの概念を持っています。また、RoleEnvironmentクラスからこの情報にアクセスできます。

how to get the endpoint from the client.のブログ記事をご覧ください。重要な点は、WCFサービスがリッスンしている内部エンドポイントを作成することです。ただし、必ずしも新しい役割が必要なわけではありません。個人的には、元のWebロールに沿ってIISでホストすることをお勧めします。&には、信頼性を向上させるための2つの役割があります。

このようにして、サービスの通信はステージングやプロダクションとしてその配備内で行われるため、配備が何であるかは関係ありません。

+0

注:api.myapp.comの場合、ホストバインドサイトを1つ設定し、www.myapp.comの場合は何かを実行します。しかし、それらは依然として同じ展開の一部である可能性があります。 –

+0

リンクをありがとう。残念ながら、私の質問を単純にする努力の中で、私は重要な情報を除外したように見えます:(実際には、サービスはMVCサイトとSilverlightプロジェクトの両方で消費されています。私の場合、あなたが提案しているアプローチは、私の場合はうまくいかないかもしれませんか?または、公平なサービスで同様のアプローチを使用する方法がありますか? – herbrandson

+0

Silverlightクライアントは、DeploymentIDを知っているか内部のエンドポイントにアクセスできるかについて贅沢を感じません。 SLのプロジェクトでは、ステージングするDNS(役割が常に応答する)またはプロダクションのDNS名(たとえばapi.myapp)を指すようにコンパイル時に決めます。 net)私はAppFabricなどの何かを使ってそれらを結びつけることなく他の方法を見ません。 –

関連する問題