2

我一直在尝试遵循此示例(从站点或此处的链接下载源代码,但我一直遇到似乎嵌入示例中的错误。

我的过程如下(在安装 AppFabric SDK 和其他依赖项):

  1. 下载源
  2. 在 AppFabric 上创建服务命名空间。
  3. 将项目导入具有一个 Worker Role 的新 Windows Azure 项目,确保它全部编译并且默认的 Worker Role Run() 方法启动并运行。
  4. 使用我的 AppFabric 服务命名空间中的 ServiceNameSpace 和 IssuerSecret 配置 InterRoleCommunicationExtension.cs 中的 GetInterRoleCommunicationEndpoint 方法(IssuerName 和 ServicePath 保持默认)。这是我自己的参数的硬接线。
  5. 将演示中“SampleWorkerRole.cs”文件中的初始化逻辑复制/粘贴到我项目的 Worker Role 的 OnStart() 方法中
  6. 注释掉对 Tracemanager.* 的引用,因为演示代码没有实现 Tracemanager 方法,它们对于此测试的工作并不重要。这些参考文献中大约有 7-10 个(只需在整个解决方案中执行 Find -> "Tracemanager")。
  7. 构建成功。
  8. 在本地计算模拟器上运行。

当我运行此测试时,在初始化新的 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.IObservable1" 此方法返回一个空数组,这会导致函数返回 null 并引发带有上述消息的异常。

我对让这个场景正常工作非常感兴趣,因为我认为发布/订阅消息传递范式是我的应用程序的完美解决方案。有没有人能够让这个演示代码(来自 AppFabric CAT 团队本身!)工作,或者可以发现我的错误?感谢您的帮助。

4

1 回答 1

3

在原始博客文章中回答(见下面的链接)。如果您仍然遇到问题,请告知。我们致力于尽最大努力支持我们的样品。

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

于 2011-02-16T02:45:18.677 回答