Реализации надежной связи между ролями, используя командлеты AppFabric файла servicebus на Azure, шаблон метода iobserver


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

Моя процедура была следующей (после установки 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();), возникает ошибка: "значение не может быть равно null. Имя параметра: contractType."

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

public static Type GetServiceContract(Type serviceType) { Guard.ArgumentNotNull(serviceType, "serviceType");

        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;
    }



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

public static IList GetDeclarativeAttributes(Type type) where T : class { Guard.ArgumentNotNull(type, "type");

        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;
    }</code><br>
Именно здесь возникает вопрос. Не найдя никаких customAttributes в типе "IObservable1", он вызывает type.GetInterfaces (), ожидая возврата. Даже если тип - это " система.IObservable1, " этот метод возвращает пустой массив, который заставляет функцию возвращать null и исключение с вышеуказанным сообщением, которое будет поднято.

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

1 ответ:

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

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