Реализации надежной связи между ролями, используя командлеты AppFabric файла servicebus на Azure, шаблон метода iobserver
Я пытался следовать этому примеру (загрузите исходный код по ссылке на сайте или здесь, но я постоянно сталкиваюсь с ошибкой, которая, кажется, встроена в пример.
Моя процедура была следующей (после установки AppFabric SDK и других зависимостей):
- загрузить исходный код
- создайте пространство имен служб в AppFabric.
- импортируйте проект в новый проект Windows Azure с одной рабочей ролью, убедитесь, что что все это компилируется и что запускается и функционирует метод Run() рабочей роли по умолчанию.
- сконфигурируйте метод GetInterRoleCommunicationEndpoint в InterRoleCommunicationExtension.cs с ServiceNameSpace и IssuerSecret из моего пространства имен службы AppFabric (IssuerName и ServicePath остаются по умолчанию). Это жесткая проводка моих собственных параметров.
- скопируйте / вставьте логику инициализации из " SampleWorkerRole.cs " файл в демо-версии в метод OnStart() моего проекта Рабочая Роль
- закомментируйте ссылки на Tracemanager.* поскольку в демонстрационном коде не реализованы методы Tracemanager, и они не являются критичными для работы этого теста. Существует около 7-10 таких ссылок (просто найдите - > "Tracemanager" во всем решении).
- построение успешно.
- запуск на локальном вычислительном эмуляторе.
Когда я выполняю этот тест, во время инициализации нового 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!) работает, или может заметить мою ошибку? Спасибо за вашу помощь.