我希望构建一个混合应用程序,在该应用程序中,我公开了一个特定的WCF服务,该服务是在内部托管,在Azure网站的防火墙后面。 Azure网站将简单地调用我的WCF服务来获取和放置数据。
我原以为Azure内部有一种Azure Connect连接到特定WCF服务的方式,但是现在我已经将它安装在网络上的沙箱机器上,我不确定就是这样。我希望能够将Azure和我的网络之间的连接锁定到我指定的那些WCF服务,以提高安全性。
将我的WCF服务暴露给Azure网站有哪些选择?
答案 0 :(得分:2)
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),尽管通常使用Service Bus注册的简单操作往往会为NAT提供足够的信息,遍历您的基础设施。
Service Bus支持各种中继绑定,如下所述:http://msdn.microsoft.com/en-us/library/windowsazure/hh410102.aspx。
我的博客上有关于Service Bus的演示文稿,示例代码有两个专门演示中继的项目。查看http://www.stratospher.es/blog/post/slides-and-code-from-dallas-july-10-2012-windows-azure-cloud-summit并下载示例代码。您想要的两个项目是“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();
然后,在客户端,您只需通过服务总线使用该服务。看起来像这样:
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));
}
秘密的问题是对CreateServiceUri的调用,它确定了SB托管的URI。
希望这有帮助,但如果您需要更多,请告诉我,
亚当霍夫曼Windows Azure博客 - http://stratospher.es
答案 1 :(得分:0)
在该级别,Azure网站只是一个调用现场WCF服务的客户端,需要打开防火墙以允许拨入和拨出适当的呼叫。
查看Azure Service Bus,但它是基于消息的。