ここでは、Azure Service Bus があなたの味方です。あなたが実際にやろうとしているのは、具体的にはここで概説されているように、サービス バス リレーを有効にすることです。
http://www.windowsazure.com/en-us/develop/net/how-to-guides/service-bus-relay/
また、環境内のサービスは、ファイアウォールを介して Service Bus に公開する必要があります。ここ (http://msdn.microsoft.com/en-us/library/windowsazure/ee706729.aspx) でいくつかの便利なヒントを見つけることができますが、多くの場合、サービス バスに登録するという単純な行為によって、NAT に十分な情報が提供され、インフラストラクチャを通過します。
Service Bus は、http: //msdn.microsoft.com/en-us/library/windowsazure/hh410102.aspxに記載されているように、さまざまなリレー バインディングをサポートしています。
ブログで Service Bus に関するプレゼンテーションを行っています。サンプル コードには、リレーを具体的に示す 2 つのプロジェクトがあります。http://www.stratospher.es/blog/post/slides-and-code-from-dallas-july-10-2012-windows-azure-cloud-summitを見て、サンプル コードをダウンロードしてください。必要な 2 つのプロジェクトは、「RelayDemoServer」と「RelayDemoClient」です。サンプル コードではリレーをコードで構成しますが、好みに応じて構成を介してこれを行うこともできます。
簡単に言うと、必要なサービスの WCF エンドポイントをサーバー側 (インフラストラクチャ内) で作成し、Service Bus で同等のリレー バインディングを作成する必要があります。これが完了すると、内部エンドポイントの Service Bus でホストされたバージョンになります。次のようになります。
// create the host itself...
System.ServiceModel.ServiceHost host =
new ServiceHost(typeof(ProblemSolver));
// programmatically add the endpoints
// 1. the WCF endpoint "internally"
host.AddServiceEndpoint(
typeof(IProblemSolver),
new NetTcpBinding(),
"net.tcp://localhost:9358/solver"
);
// 2. the endpoint that is projected back through the service bus (note: NetTcpRelayBinding)
// This one will end up with a DNS name of "sb://[serviceNamespace].servicebus.windows.net/solver"
host.AddServiceEndpoint(
typeof(IProblemSolver),
new NetTcpRelayBinding(),
ServiceBusEnvironment.CreateServiceUri("sb", Microsoft.WindowsAzure.CloudConfigurationManager.GetSetting("ServiceBusNamespace"), "solver"))
.Behaviors.Add(new TransportClientEndpointBehavior
{
TokenProvider = TokenProvider.CreateSharedSecretTokenProvider("owner", Microsoft.WindowsAzure.CloudConfigurationManager.GetSetting("ServiceBusSecret"))
});
host.Open();
次に、クライアント側では、Service Bus を介してサービスを利用するだけです。それは次のようになります。
var cf = new ChannelFactory<RelayDemoServer.IProblemSolverChannel>(
new NetTcpRelayBinding(),
new EndpointAddress(
ServiceBusEnvironment.CreateServiceUri(
"sb",
Microsoft.WindowsAzure.CloudConfigurationManager.GetSetting("ServiceBusNamespace"),
"solver"
)
)
);
cf.Endpoint.Behaviors.Add(
new TransportClientEndpointBehavior
{
TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(
"owner",
Microsoft.WindowsAzure.CloudConfigurationManager.GetSetting("ServiceBusSecret")
)
}
);
using (var ch = cf.CreateChannel())
{
Console.WriteLine(ch.AddNumbers(4, 5));
}
秘密のソースは、SB がホストする URI を把握する CreateServiceUri への呼び出しです。
これがお役に立てば幸いですが、さらに必要な場合はお知らせください。
アダム・ホフマン
Windows Azure ブログ - http://stratospher.es
ツイッター - http://twitter.com/stratospher_es