Azure WorkerRole中用于Silverlight应用程序的WCF服务

Azure WorkerRole中用于Silverlight应用程序的WCF服务,wcf,azure,cross-domain,Wcf,Azure,Cross Domain,我有一个承载WCF服务的Windows Azure WorkerRole。此服务应由Silverlight应用程序使用。在本地,这很好,但是,当我尝试部署它时,需要在角色配置中配置端点(请参见下图) 当我删除端点“WCFEndpoint”时,在本地一切正常。但是,如果存在,则会发生以下异常: System.ServiceModel.AddressalReadyUseException:HTTP konnte die URL “”没有注册,但没有TCP端口 9196年的今天,我的朋友和我在一起

我有一个承载WCF服务的Windows Azure WorkerRole。此服务应由Silverlight应用程序使用。在本地,这很好,但是,当我尝试部署它时,需要在角色配置中配置端点(请参见下图)

当我删除端点“WCFEndpoint”时,在本地一切正常。但是,如果存在,则会发生以下异常:

System.ServiceModel.AddressalReadyUseException:HTTP konnte die URL “”没有注册,但没有TCP端口 9196年的今天,我的朋友和我在一起

这在英语中意味着:HTTP无法注册URL“…”,因为TCP端口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>

为了在云中托管服务,我需要在这三个地方进行哪些更改?

首先也是最重要的问题是,您使用“localhost”作为绑定地址。这在Windows Azure中永远不会起作用。Windows Azure中的所有流量都被定向(从负载平衡器)到角色实例(VM)的物理内部IP地址(也称为DIP或直接IP地址)

为了在windows azure中工作,您必须绑定到角色实例的DIP(直接IP地址)并使用输入端点提供的端口。我是这样做的(对于工作者角色和自托管WCF):

这在本地开发人员和real live Azure环境中100%有效。这里需要注意的是,我从角色输入端点的IPEndpoint实例动态构建端点


我非常确信,一旦您将服务绑定到实际的IP地址和端口(从roleenEnvironment.CurrentRoleInstance.InstanceEndpoints[“WCFEndpoint”]),您的服务将按预期工作

谢谢你的解释。我试过这个,它在云中也能在本地工作。只有一个问题:在我以前的解决方案中,我能够使用VisualStudio中的“添加服务引用”窗口使用WCF服务。我只需输入地址,它就会找到服务并自动创建引用。对于修改后的版本,无法添加该引用。你知道为什么吗?这可能是跨域的事情吗?我现在使用的解决方法是首先使用我的旧代码添加引用,然后更改代码。嗯,我的解决方案是使用基于合同创建的手动serviceclient。但是,在VisualStudio中,您可以尝试“在解决方案中发现服务”,而不是键入地址来查找服务。这样VS就可以找到服务并创建本地服务代理类(不过我不确定)。
ServiceHost greenwayServiceHost = new ServiceHost(typeof(GreenwayService));
ServiceHost crossDomainServiceHost = new ServiceHost(typeof(CrossDomainService));
greenwayServiceHost.Open();
crossDomainServiceHost.Open();
 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();
    }