我一直在尝试遵循此示例(从站点或此处的链接下载源代码,但我一直遇到似乎嵌入示例中的错误。
我的过程如下(在安装 AppFabric SDK 和其他依赖项):
- 下载源
- 在 AppFabric 上创建服务命名空间。
- 将项目导入具有一个 Worker Role 的新 Windows Azure 项目,确保它全部编译并且默认的 Worker Role Run() 方法启动并运行。
- 使用我的 AppFabric 服务命名空间中的 ServiceNameSpace 和 IssuerSecret 配置 InterRoleCommunicationExtension.cs 中的 GetInterRoleCommunicationEndpoint 方法(IssuerName 和 ServicePath 保持默认)。这是我自己的参数的硬接线。
- 将演示中“SampleWorkerRole.cs”文件中的初始化逻辑复制/粘贴到我项目的 Worker Role 的 OnStart() 方法中
- 注释掉对 Tracemanager.* 的引用,因为演示代码没有实现 Tracemanager 方法,它们对于此测试的工作并不重要。这些参考文献中大约有 7-10 个(只需在整个解决方案中执行 Find -> "Tracemanager")。
- 构建成功。
- 在本地计算模拟器上运行。
当我运行此测试时,在初始化新的 InterRoleCommunicationExtension(要初始化的角色间通信基础结构的第一部分this.interRoleCommunicator = new InterRoleCommunicationExtension();
)期间,出现错误:“值不能为空。参数名称: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 参数的 Name 属性是“IInterRoleCommunicationServiceContract”,它是演示的类之一,它扩展了 IObservable。对 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>
It is here that the issue arises. After not finding any customAttributes on the "IObservable1" type, it calls type.GetInterfaces(), expecting a return. Even though type is "System.IObservable
1" 此方法返回一个空数组,这会导致函数返回 null 并引发带有上述消息的异常。
我对让这个场景正常工作非常感兴趣,因为我认为发布/订阅消息传递范式是我的应用程序的完美解决方案。有没有人能够让这个演示代码(来自 AppFabric CAT 团队本身!)工作,或者可以发现我的错误?感谢您的帮助。