Обновление URL-адреса службы Dyanmic WCF в проекте веб-роли Azure (веб-сайт)

У меня есть проект Azure с двумя веб-ролями (проект веб-сайта Azure и роль службы Azure WCF). Служба WCF используется проектом веб-сайта Azure и указывается с помощью параметра «Добавить ссылку на службу». Веб-сайт использует URL-адрес, определенный в файле web.config, для подключения к службе WCF, которая отлично работает в локальном эмуляторе вычислений dev/Azure. На моей локальной машине разработки, когда я запускаю решение, служба и веб-сайт загружаются и выполняются в IIS Express с URL-адресом «http://127.0.0.1:8080/v1.svc» и «http://127.0.0.1:8080/v1.svc». 0,1:81/" соответственно.

Однако, когда я опубликовал приложение в облачных службах Azure, оно создало отдельную машину/ВМ/экземпляр для веб-сайта и службы соответственно (поскольку они считаются двумя разными ролями).

Теперь мой вопрос: поскольку Azure назначает IP-адрес для экземпляров во время выполнения, как мне динамически изменить URL-адрес в (в веб-сайте web.config) и обновить службу WCF, чтобы веб-сайт мог беспрепятственно использовать службу WCF?

Цените свое время.

Спасибо, Картик.


person user1421803    schedule 06.01.2013    source источник


Ответы (2)


Спасибо за ваш ответ. Я попробовал решение, но получил ошибку 404. В моем случае имя webrole — «TimeSheetUI», и когда я попытался получить доступ к сервису, используя «timesheetui.cloudapp.net: 8080», он выдает ошибку 404. Однако, если я попытаюсь получить к нему доступ, используя http://e214d16594be4e31abfbf0488b5d612b.cloudapp.net:8080/timesheetservices.svcservices.svc /a> это работает. Я надеюсь, что мне не нужно добавлять какие-либо записи CNAME с DNS и т. д., чтобы заставить его работать.

Однако я попробовал программный вариант для создания URL-адреса во время выполнения с параметром Тип конечной точки службы, установленным на «Внутренний».

var endpoints = RoleEnvironment.Roles["TimeSheetService"].Instances.Select(i => i.InstanceEndpoints["TimeSheetService.EndPoint"]).ToArray();
var r = new Random();
EndpointAddress endPointAddress = new EndpointAddress(String.Format("http://{0}/TimeSheetService.svc", endpoints[r.Next(endpoints.Count() - 1)].IPEndpoint));
var factory = new ChannelFactory<TimeSheetProxy.ITimeSheet>("BasicHttpBinding_ITimeSheet");var client = factory.CreateChannel(endPointAddress);TimeSheetUI.TimeSheetProxy.TimeSheet[] ts = client.DisplayTimeSheets();

Приведенный выше код работает без проблем. Но не уверен, что это элегантный способ сделать это!

Найдено вышеуказанное решение @ http://lab.studiopesec.com/azure-applications-101-part-ii/

person user1421803    schedule 08.01.2013

Укажите конечную точку/порт для вашего сервиса в файле ServiceConfig:

<ServiceDefinition name="MyService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
   <WebRole name="WCFServiceRole">
      …
      <Endpoints>
         <InputEndpoint name="HttpIn" protocol="http" port="8080" localPort="8080" />
      </Endpoints>
   </WebRole>
   <WebRole name="MyWebRole">
      …
      <Endpoints>
         <InputEndpoint name="HttpIn" protocol="http" port="80" localPort="80" />
      </Endpoints>
   </WebRole>
   …
</ServiceDefinition>

Затем в файле web.config укажите конечную точку WCF, используя Azure DNS и порт (например, mywebrole.cloudapp.net:8080).

Дополнительные сведения см. в руководстве по использованию WCF в Windows Azure.

person viperguynaz    schedule 06.01.2013