2 Stimmen

Implementierung einer zuverlässigen Inter-Role-Kommunikation unter Verwendung des AppFabric ServiceBus auf Azure, IObserver-Muster

Ich habe versucht zu folgen dieses Beispiel (laden Sie den Quellcode über einen Link auf der Website herunter oder aquí , aber ich stoße immer wieder auf einen Fehler, der in das Beispiel eingebettet zu sein scheint.

Ich bin wie folgt vorgegangen (nachdem ich das AppFabric SDK und andere Abhängigkeiten installiert hatte):

  1. Download der Quelle
  2. Erstellen Sie einen Dienst-Namensraum auf der AppFabric.
  3. Importieren Sie das Projekt in ein neues Windows Azure-Projekt mit einer Worker-Rolle, stellen Sie sicher, dass alles kompiliert wird und dass die Standardmethode Worker Role Run() startet und funktioniert.
  4. Konfigurieren Sie die Methode GetInterRoleCommunicationEndpoint in InterRoleCommunicationExtension.cs mit dem ServiceNameSpace und IssuerSecret aus meinem AppFabric Service Namespace (IssuerName und ServicePath bleiben Standard). Dies ist eine feste Verdrahtung meiner eigenen Parameter.
  5. Kopieren Sie die Initialisierungslogik aus der Datei "SampleWorkerRole.cs" in der Demo und fügen Sie sie in die OnStart()-Methode der Worker-Rolle in meinem Projekt ein
  6. Kommentieren Sie die Verweise auf Tracemanager.* aus, da im Democode die Tracemanager-Methoden nicht implementiert sind und sie für das Funktionieren dieses Tests nicht entscheidend sind. Es gibt etwa 7-10 dieser Verweise (führen Sie einfach eine Suche -> "Tracemanager" in der gesamten Lösung aus).
  7. Erfolgreich bauen.
  8. Ausführung auf lokalem Compute Emulator.

Wenn ich diesen Test ausführe, wird während der Initialisierung einer neuen InterRoleCommunicationExtension (der erste Teil der Inter-Role-Kommunikationsinfrastruktur, der initialisiert wird, this.interRoleCommunicator = new InterRoleCommunicationExtension(); ), wird ein Fehler ausgelöst: "Wert kann nicht null sein. Parametername: contractType."

Wenn ich die Sache ein wenig vertiefe, verfolge ich die Ausführung bis zur folgenden Methode in ServiceBusHostFactory.cs (eine der Dateien aus dem Beispiel):

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

Die Eigenschaft Name des serviceType-Parameters ist "IInterRoleCommunicationServiceContract", eine der Klassen der Demo, die IObservable erweitert. Der Aufruf von serviceType.GetInterfaces() gibt die Schnittstelle "System.IObservable`1" zurück, die dann in FrameworkUtility.GetDeclarativeAttribute(serviceInterface); die den folgenden Code hat:

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", gibt diese Methode ein leeres Array zurück, was dazu führt, dass die Funktion null zurückgibt und die Ausnahme mit der oben genannten Meldung ausgelöst wird.

Ich bin sehr daran interessiert, dass dieses Szenario funktioniert, da ich denke, dass das Publish/Subscribe-Messaging-Paradigma die perfekte Lösung für meine Anwendung ist. Ist es jemandem gelungen, diesen Demo-Code (vom AppFabric CAT Team selbst!) zum Laufen zu bringen, oder kann er meinen Fehler erkennen? Ich danke Ihnen für Ihre Hilfe.

3voto

Valery M Punkte 46

Die Antwort finden Sie im ursprünglichen Blogbeitrag (siehe Link unten). Bitte informieren Sie uns, wenn Sie immer noch Probleme haben. Wir bemühen uns nach besten Kräften, unsere Proben zu unterstützen.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X