Реализация надежного взаимодействия между ролями с использованием AppFabric ServiceBus в Azure, шаблон IObserver - PullRequest
2 голосов
/ 16 февраля 2011

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

Моя процедура была следующей (после установки AppFabric SDK и других зависимостей):

  1. Скачать исходный код
  2. Создайте пространство имен службы в AppFabric.
  3. Импортируйте проект в новый проект Windows Azure с одной рабочей ролью, убедитесь, что он все компилируется и что запускается и работает метод Run () рабочей роли по умолчанию.
  4. Сконфигурируйте метод GetInterRoleCommunicationEndpoint в InterRoleCommunicationExtension.cs с помощью ServiceNameSpace и IssuerSecret из моего пространства имен служб AppFabric (IssuerName и ServicePath остаются по умолчанию). Это жесткая привязка моих собственных параметров.
  5. Скопируйте / вставьте логику инициализации из файла "SampleWorkerRole.cs" в демонстрационной версии в метод OnStart () рабочей роли моего проекта
  6. Закомментируйте ссылки на Tracemanager. * Поскольку в демонстрационном коде не реализованы методы Tracemanager, и они не имеют решающего значения для работы этого теста. Существует около 7-10 таких ссылок (просто выполните поиск -> «Tracemanager» во всем решении).
  7. Построить успешно.
  8. Запуск на локальном эмуляторе вычислений.

Когда я запускаю этот тест, во время инициализации нового InterRoleCommunicationExtension (первый элемент инфраструктуры межрелигиозных коммуникаций, который должен быть инициализирован, this.interRoleCommunicator = new InterRoleCommunicationExtension();) возникает ошибка: "Значение не может быть нулевым. Имя параметра: contractType. "

Немного углубившись в это, я прослеживаю выполнение до следующего метода в ServiceBusHostFactory.cs (один из файлов из примера):

public static Type GetServiceContract(Type serviceType) { Guard.ArgumentNotNull(serviceType, "serviceType");</p> <pre><code> Type[] serviceInterfaces = serviceType.GetInterfaces(); if (serviceInterfaces != null && serviceInterfaces.Length > 0) { foreach (Type serviceInterface in serviceInterfaces) { ServiceContractAttribute serviceContractAttr = FrameworkUtility.GetDeclarativeAttribute<ServiceContractAttribute>(serviceInterface); if (serviceContractAttr != null) { return serviceInterface; } } } return null; }



Свойство Name параметра serviceType имеет значение «IInterRoleCommunicationServiceContract», которое является одним из классов демонстрации и расширяет IObservable. Вызов serviceType.GetInterfaces () возвращает интерфейс «System.IObservable`1», который затем передается в FrameworkUtility.GetDeclarativeAttribute(serviceInterface);, который имеет следующий код:

public static IList GetDeclarativeAttributes(Type type) where T : class { Guard.ArgumentNotNull(type, "type");</p> <pre><code> object[] customAttributes = type.GetCustomAttributes(typeof(T), true); IList<T> attributes = new List<T>(); if (customAttributes != null && customAttributes.Length > 0) { foreach (object customAttr in customAttributes) { if (customAttr.GetType() == typeof(T)) { attributes.Add(customAttr as T); } } } else { Type[] interfaces = type.GetInterfaces(); if (interfaces != null && interfaces.Length > 0) { foreach (object[] customAttrs in interfaces.Select(iface => iface.GetCustomAttributes(typeof(T), false))) { if (customAttrs != null && customAttrs.Length > 0) { foreach (object customAttr in customAttrs) { attributes.Add(customAttr as T); } } } } } return attributes; }

Именно здесь возникает проблема. После того, как не найдено никаких пользовательских атрибутов типа «IObservable1», он вызывает type.GetInterfaces (), ожидая возврата. Несмотря на то, что типом является «System.IObservable 1», этот метод возвращает пустой массив, в результате чего функция возвращает нулевое значение, и возникает исключение с указанным выше сообщением.

Я чрезвычайно заинтересован в том, чтобы этот сценарий работал, так как я думаю, что парадигма обмена сообщениями «Публикация / подписка» является идеальным решением для моего приложения. Кто-нибудь смог заставить работать этот демонстрационный код (от самой команды разработчиков AppFabric CAT!), Или может обнаружить мою ошибку? Спасибо за вашу помощь.

1 Ответ

3 голосов
/ 16 февраля 2011

Ответил в оригинальном сообщении в блоге (см. Ссылку ниже).Пожалуйста, сообщите, если у вас все еще есть проблемы.Мы стремимся поддерживать наши образцы на основе максимальных усилий.

http://blogs.msdn.com/b/appfabriccat/archive/2010/09/30/implementing-reliable-inter-role-communication-using-windows-azure-appfabric-service-bus-observer-pattern-amp-parallel-linq.aspx#comments

...