Azure: связь внутри WebRole (netTcpBinding) с Full-IIS - PullRequest
5 голосов
/ 22 мая 2011

Мне нужно на лету изменить некоторые параметры конфигурации в проекте Windows Azure - и их нужно изменить с помощью вызова веб-службы (обновление конфигурации приложения либо через API платформы, либо с сайта управления Azure не выполняется).вариант здесь).

Проект имеет несколько веб-ролей и рабочих ролей - все они должны знать о новой конфигурации при ее изменении.

Конфигурация сохраняется в долговременном хранилище и также кэшируется во времявремя выполнения в статической переменной.

Мое решение состояло в том, чтобы создать внутреннюю (tcp) конечную точку для моих ролей и использовать ее для циклического прохождения всех ролей и экземпляров в этих ролях, создания клиента на лету и рассказывания экземпляру оновая настройка.(в значительной степени совпадает с: http://msdn.microsoft.com/en-us/gg457891)

Сначала я запустил ServiceHost в RoleEntryPoint WebRole ... и я был озадачен, почему все работало нормально, когда я проходил через коммуникации (статические переменные, гдеустанавливается правильно) - тем не менее, когда я выполнял другие вызовы веб-службы, статическая переменная, казалось, «забыла» то, что я установил.

Это имело место как локально, так и в промежуточной среде Azure.

В этот момент я понял, что, поскольку мы используем режим полного IIS, RoleEntryPoint и веб-службы выполнялись в двух отдельных процессах - один в заглушке Azure и один в IIS.

«Не проблема», - сказал я. Я просто перенесу строку кода, которая запускает ServiceHost, из моего RoleEntryPoint в global.asax - после чего ServiceHost будет запущен в том же процессе, что и остальная часть сайта.- и статические переменные будут такими же.

Вот где у меня проблема;отлично работает на моей локальной машине, работающей в среде разработчика.Как только я выполняю развертывание, я начинаю получать сообщения об ошибках, в которых говорится, что канал, используемый для подключения к службе, не может быть закрыт, потому что он находится в "неисправном состоянии".

Вопрос:

  • Чем отличается среда Azure vs. Dev от этой причины?
  • Как устранить или обойти проблему?
  • Есть ли у кого-нибудь общие рекомендации о том, как мне следует получитьболее описательная ошибка ... мне нужно включить полную диагностику wcf в Azure, чтобы получить это, или есть какой-то другой способ получить подробности об исключении?

Последующее наблюдение:

С помощью удаленного рабочего стола я узнал несколько интересных вещей:

  • Активация без HTTP не устанавливается по умолчанию в Azure WebRoles.Я считаю, что это можно преодолеть с помощью сценария запуска:

    start / w pkgmgr / iu: WCF-NonHTTP-Activation;

  • Сайт, созданный в IIS через ИнтернетВ роли не включен протокол net.tcp по умолчанию.Я также считаю, что это можно преодолеть с помощью сценария запуска:

    % systemroot% \ system32 \ inetsrv \ appcmd.exe установить приложение "Имя сайта здесь" /enabledProtocols:https,http,net.tcp

У меня не было времени, чтобы принять это полностью, поскольку сроки заставили меня временно применить некоторые обходные пути.

Некоторые полезные ссылки, связанные с этой темой:

http://msdn.microsoft.com/en-us/magazine/cc163357.aspx

http://forums.iis.net/t/1160443.aspx

http://msdn.microsoft.com/en-us/library/ms731053.aspx

http://labs.episerver.com/en/Blogs/Paul-Smith/Dates/2008/6/Hosting-non-HTTP-based-WCF-applications-in-IIS7/

Ответы [ 2 ]

1 голос
/ 25 июня 2011

ОБНОВЛЕНИЕ (27.06.2011):

Удивительно, но кто-то в Microsoft (чей блог я комментировал) на самом деле получил ответ на этот вопрос.

Команды Azure и WCF обновили этот пост:

http://blogs.msdn.com/b/windowsazure/archive/2011/06/27/hosting-services-with-was-and-iis-on-windows-azure.aspx

Ссылка содержит всю информацию, необходимую для начала работы.

И огромное спасибо Явору Георгиеву, премьер-министру MSFT с победой.


Прошло много времени с тех пор, как я задал вопрос, а ответов нет, поэтому позвольте мне оставить это:

Согласно моим последующим действиям в этом посте, есть способы сделать эту работу ... но они сложны и трудны для реализации.

Для рабочих ролей netTcpBinding работает отлично. Здесь нет проблем. Идите и используйте это.

Для веб-ролей у вас есть проблемы. Но netTcpBinding - это то, что вам нужно использовать для демонстрации внутренних конечных точек. Что делать?

Ну, вот что я сделал:

  • Запустите службу netTcpBinding в вашей RoleEntryPoint с помощью ServiceHost.
  • Создайте стандартную службу WCF в своей веб-роли, используя SOAP / JSON / что угодно.
  • Когда вы получаете запросы через netTcpBinding, прокси их через службу WCF на адаптере обратной связи.
  • Надежно защитите свой «внутренний» сервис WCF с помощью сертификатов клиента SSL.

Это не идеально ... но это работает, и это не ужасно.

Я подозреваю, что необходимость делать подобные вещи не слишком распространена, и я действительно не могу придумать причину, по которой вам нужно, кроме как динамически изменять настройки во время выполнения ... что означает, что вы ' не швыряю эти услуги как сумасшедшие.

Очевидно, YMMV.

0 голосов
/ 23 мая 2011

У меня было ужасное время, когда HTTP работал между экземплярами в стадии подготовки, и я сдался, когда мне показалось, что мне нужно возиться с netsh, чтобы дать своим процессам разрешение на прослушивание через HttpListener (sheesh!). Поэтому я перешел на TCP через сокеты. HTTP просто добавляет издержки в сценарии двухточечной связи, подобном этому.

...