我有一个承载WCF服务的Windows Azure WorkerRole。此服务应由Silverlight应用程序使用。在本地,这很好,但是,当我尝试部署它时,需要在角色配置中配置端点(参见下图)。
当我删除该端点“WCFEndpoint”时,一切都在本地工作正常。但是,当它存在时,会发生以下异常:
System.ServiceModel.AddressAlreadyInUseException:HTTP konnte die URL “http://+:9196/GreenwayService/”nicht registrieren,weil der TCP-Port 9196 von einer anderen Anwendung verwendet wird。
这意味着英文:HTTP无法注册URL“...”,因为TCP PORT 9196被另一个应用程序使用。
据我了解,端点需要像图片中一样定义,以便在云端内访问。
这是我的app.config:
<?xml version="1.0"?>
<configuration>
<system.diagnostics>
<trace>
<listeners>
<add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">
<filter type=""/>
</add>
</listeners>
</trace>
</system.diagnostics>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup><system.serviceModel>
<services>
<service name="Greenway.AzureWorkerRole.ServiceHosting.CrossDomainService">
<endpoint address="" behaviorConfiguration="HttpEnableBehavior"
binding="webHttpBinding" contract="Greenway.AzureWorkerRole.ServiceHosting.ICrossDomainService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:9196/" />
</baseAddresses>
</host>
</service>
<service behaviorConfiguration="GreenwayServiceBehavior" name="Greenway.AzureWorkerRole.ServiceHosting.GreenwayService">
<endpoint address="" binding="basicHttpBinding" contract="Greenway.AzureWorkerRole.ServiceHosting.IGreenwayService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:9196/GreenwayService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="HttpEnableBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="GreenwayServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
这是启动服务的代码片段:
ServiceHost greenwayServiceHost = new ServiceHost(typeof(GreenwayService));
ServiceHost crossDomainServiceHost = new ServiceHost(typeof(CrossDomainService));
greenwayServiceHost.Open();
crossDomainServiceHost.Open();
为了在云中托管服务,我需要在这三个地方内进行哪些更改?
答案 0 :(得分:2)
首要问题是您使用“localhost”作为绑定地址。这在Windows Azure中永远不会起作用。 Windows Azure中的所有流量(从负载均衡器)定向到角色实例(VM)的物理内部IP地址(也称为DIP或直接IP地址)。
为了在windows azure中工作,你必须绑定到Role实例的DIP(直接IP地址)并使用Input Endpoint提供的端口。我这样做(对于Worker Role和自托管的WCF):
private void CreateServiceHost()
{
this._serviceHost = new UnityServiceHost(typeof(MyService));
var binding = new NetTcpBinding(SecurityMode.None);
RoleInstanceEndpoint externalEndPoint =
RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["ServiceEndpoint"];
string endpoint = String.Format(
"net.tcp://{0}/MyService", externalEndPoint.IPEndpoint);
this._serviceHost.AddServiceEndpoint(typeof(IMyService), binding, endpoint);
this._serviceHost.Open();
}
这在本地开发和真实的Azure环境中100%有效。这里要注意的是我从我的角色的输入端点的IPEndpoint实例动态地构建我的端点。
我很确定一旦将它们绑定到您从RoleEnvironment.CurrentRoleInstance.InstanceEndpoints [“WCFEndpoint”]中获取的实际IP地址和端口,您的服务将按预期工作;