3 Stimmen

WCF Routing - wie man eine Filtertabelle programmatisch korrekt hinzufügt

Ich verwende den WCF 4-Routingdienst und muss den Dienst programmatisch konfigurieren (im Gegensatz zur Verwendung von Konfigurationsdateien). Die Beispiele, die ich dazu gesehen habe, die selten sind, erstellen eine MessageFilterTable wie folgt:

var filterTable = new MessageFilterTable>();

Aber der generische Parameter dieser Methode sollte eigentlich TFilterData sein (der Typ der Daten, nach denen gefiltert wird)? Ich habe meinen eigenen benutzerdefinierten Filter, der einen String akzeptiert - kann ich den Filter auf diese Weise trotzdem erstellen?

Wenn das funktioniert... wird die Routing-Infrastruktur Client-Endpunkte aus der Liste erstellen, die ich übergebe?

5voto

dlanod Punkte 7997

Ich habe einen WCF 4 Routing-Service erstellt und ihn programmgesteuert konfiguriert. Mein Code ist etwas mehr ausgeräumt, als er es sein müsste (die Wartbarkeit für andere ist ein Anliegen, daher die Kommentare), aber er funktioniert definitiv. Dies hat zwei Filter: einen filtert bestimmte Aktionen zu einem bestimmten Endpunkt, und der zweite sendet die verbleibenden Aktionen an einen generischen Endpunkt.

        // Erstellen der Nachrichtenfiltertabelle für das Routen von Nachrichten
        MessageFilterTable> filterTable = new MessageFilterTable>();

        // Wenn wir ein Abonnement verarbeiten, senden wir es an den Abonnement-Endpunkt
        filterTable.Add(
            new ActionMessageFilter(
                "http://etcetcetc/ISubscription/Subscribe",
                "http://etcetcetc/ISubscription/KeepAlive",
                "http://etcetcetc/ISubscription/Unsubscribe"),
            new List()
            {
                new ServiceEndpoint(
                    new ContractDescription("ISubscription", "http://etcetcetc/"),
                    binding,
                    new EndpointAddress(String.Format("{0}{1}{2}", TCPPrefix, HostName, SubscriptionSuffix)))
            },
            HighRoutingPriority);

        // Ansonsten senden wir alle anderen Pakete an den Routing-Endpunkt
        MatchAllMessageFilter filter = new MatchAllMessageFilter();
        filterTable.Add(
            filter,
            new List()
            {
                new ServiceEndpoint(
                    new ContractDescription("IRouter", "http://etcetcetc/"),
                    binding,
                    new EndpointAddress(String.Format("{0}{1}{2}", TCPPrefix, HostName, RouterSuffix)))
            },
            LowRoutingPriority);

        // Fügen Sie dann die Filtertabelle als Teil eines Routing-Verhaltens dem Host hinzu
        _routingHost.Description.Behaviors.Add(
            new RoutingBehavior(new RoutingConfiguration(filterTable, false)));

3voto

Adam Punkte 4117

Sie können ein gutes Beispiel auf MSDN hier finden: How To: Dynamic Update Routing Table

Beachten Sie, wie sie keine Instanz der MessageFilterTable direkt erstellen, sondern stattdessen die 'FilterTable'-Eigenschaft verwenden, die von einer neuen RoutingConfiguration-Instanz bereitgestellt wird.

Wenn Sie einen benutzerdefinierten Filter geschrieben haben, fügen Sie ihn wie folgt hinzu:

rc.FilterTable.Add(new CustomMessageFilter("customStringParameter"), new List { physicalServiceEndpoint });

Der CustomMessageFilter wird Ihr Filter sein, und der "customStringParameter" ist der String, über den (ich glaube) Sie sprechen. Wenn der Router eine Verbindungsanforderung erhält, wird er versuchen, sie über diesen Tabelleneintrag abzubilden. Wenn dies erfolgreich ist, wird der Router tatsächlich einen Client-Endpunkt erstellen, um mit dem von Ihnen bereitgestellten ServiceEndpoint zu sprechen.

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