Служба WCF в Azure WorkerRole для приложения Silverlight - PullRequest
1 голос
/ 04 декабря 2011

У меня есть Windows Azure WorkerRole, в которой размещается служба WCF.Эта услуга используется приложением Silverlight.Локально это работает нормально, однако, когда я пытаюсь развернуть его, конечную точку необходимо настроить в конфигурации роли (см. Изображение ниже).

enter image description here

Когда я удаляю этоконечная точка "WCFEndpoint", все работает локально.Тем не менее, когда оно есть, возникает следующее исключение:

System.ServiceModel.AddressAlreadyInUseException: HTTP konnte die URL "http://+:9196/GreenwayService/" nicht registrieren, weil der TCP-Port 9196 von einer andderenAnwendung verwendet wird.

, что на английском языке означает, что 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>

И это стартовый фрагмент кодаУслуги:

ServiceHost greenwayServiceHost = new ServiceHost(typeof(GreenwayService));
ServiceHost crossDomainServiceHost = new ServiceHost(typeof(CrossDomainService));
greenwayServiceHost.Open();
crossDomainServiceHost.Open();

Что мне нужно изменить в этих трех местах для размещения служб в облаке?

1 Ответ

2 голосов
/ 05 декабря 2011

В первую очередь проблема заключается в том, что вы используете "localhost" в качестве адреса привязки.Это никогда не будет работать в Windows Azure.Весь трафик в Windows Azure направляется (от балансировщиков нагрузки) на физический внутренний IP-адрес (также называемый DIP или прямой IP-адрес) экземпляра роли (ВМ).

Чтобы все работало вWindows Azure необходимо привязать к DIP (Прямой IP-адрес) экземпляра роли и использовать порт, предоставляемый входной конечной точкой.Я делаю это так (для рабочей роли и собственного размещения 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();
    }

И это работает на 100% в локальной среде разработчика и в реальной среде Azure.Здесь следует отметить, что я динамически создаю свою конечную точку из экземпляра IPEndpoint конечной точки ввода моей роли.

Я почти уверен, что ваши службы будут работать, как и ожидалось, как только вы привяжете их к фактическому IP-адресу и порт , который вы берете из RoleEnvironment.CurrentRoleInstance.InstanceEndpoints ["WCFEndpoint"];

...