2017-04-12 1 views
0

Ich habe eine Operation (Methode) in einem WCF-Dienst. Die Operation hat einen Parameter des Json-Inhalts.Umleiten von WCF-Dienstaufrufen an andere Vorgänge basierend auf dem Nachrichteninhalt

[OperationContract] 
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification); 

Für diesen Parameter AuditLineUpdatedModel, ich habe eine Pre-definiertem-Klasse DataContractAttributes und DataMemberAttributes erstellt während der Deserialisierung die json Nachricht an ein Objekt abzubilden.

Ich habe jedoch ein Problem ist, dass der Kunde hat eine andere Json Nachrichtenstrukturen unter gleichen Feldnamen, wo ich nicht alle Fälle in einer einzigen Klasse kombinieren. Mit anderen Worten, die Json-Nachricht hat ein Feld, das unterschiedliche Struktur (nicht Wert) haben könnte; Daher versuche ich den Anruf auf eine andere Operationen, die die Vielfalt der Json-Nachricht erfüllen könnte.

Bisher habe ich festgestellt, dass WCF bietet Routing auf der Service-Ebene. Ich frage mich, ob es möglich ist, die Anrufe auf Operationsebene zu routen. Mit anderen Worten, ich habe einen einzigen Dienst mit zwei Operationen unterschiedlicher Parametertypen. Ist es möglich, den Anruf abzufangen und den Nachrichteninhalt zu überprüfen und dann den Anruf basierend auf der Nachricht an eine ordnungsgemäße Operation weiterzuleiten?

Zu Ihrer Information habe ich versucht IDispatchMessageInspector (Message Inspector-Funktion) von WCF. Ich war in der Lage, den Inhalt der Nachricht zu überprüfen, aber ich kann die Zieladresse (To uri) nicht umleiten oder ändern. Hinweis: Darüber hinaus ist der Clientdienst nicht in der Lage, verschiedene URI-Anforderungen für die beiden unterschiedlichen Fälle zu senden.

+0

- "aber ich kann das Ziel nicht umleiten oder ändern (To uri)" - können Sie uns sagen, warum? Wenn Sie einen anderen Dienst zum Verarbeiten des neuen Nachrichtentyps haben, sollten Sie sicherlich einen neuen Dienstclient für diesen Dienst erstellen und die Nachricht mit dem neuen Dienst verarbeiten und dann das Ergebnis an den ursprünglichen Dienst zurücksenden können. –

+0

Hi @KosalaW, wenn ich versuche, die folgende Zeile auszuführen, erhalte ich eine Fehleranforderung. Headers.Add (MessageHeader.CreateHeader ("An", "An", )); Fehlermeldung: Umschlag Version 'EnvelopeNone (schemas.microsoft.com/ws/2005/05/envelope/none)'; unterstützt nicht das Hinzufügen von Nachrichtenkopfzeilen –

+0

Siehe meine Antwort unten. Lassen Sie mich wissen, wenn Sie weitere Fragen haben. Sie sollten für den neuen Dienst keine Header hinzufügen müssen. Du brauchst nur den Körper. –

Antwort

0

Dies ist nur ein Beispiel. Der Code ist konzeptionell und Sie müssen ihn so implementieren, wie Sie möchten.

[OperationContract] 
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification); 

// you can host this somewhere else 
[OperationContract] 
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
string MyInternalService(AuditLineUpdatedModel1 notification); 

public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext) 
{ 
    object response; 
    var isCallToMyInternalServiceRequired = VerificationMethod(request, out response); 
    if(!isCallToMyInternalServiceRequired) 
    { 
     using(var client = new NotifyAuditLineUpdatedClient()) 
     { 
      return client.NotifyAuditLineUpdated(response as AuditLineUpdatedModel); 
     } 
    } 

    using(var client = new MyInternalServiceClient()) 
    { 
     return client.MyInternalServiceClient(response as AuditLineUpdatedModel1); 
    } 
} 

private bool VerificationMethod(object notification, out object output) 
{ 
    // your validation method. 
} 
+0

Ich denke, das ist die beste Antwort, die ich bis jetzt bekommen habe, aber eine Sache würde diese Antwort komplett machen. Mit dieser Lösung kann ich jede Methode, die ich brauche, auf Basis der empfangenen Anfrage namentlich aufrufen, aber eine Sache würde immer noch dazu führen, dass WCF die ursprüngliche Client-Request-Methode aufruft, kann ich den Aufruf hier nicht komplett auf eine andere Methode umleiten ? –

Verwandte Themen