2016-06-22 5 views
0

Ich muss einige Protokolle in .NET mit WCF-Technologie in JSON gespeichert wiedergeben. Die Software verwendet IClientMessageInspector zum Abrufen der Protokolle und speichert sie anschließend in JSON. Also, ich muss diese Protokolle bekommen und sie erneut injizieren. Um dies zu tun, habe ich etwas Ähnliches getan wie ich, als ich die Protokolle erhalte. Ich habe den WCF EndPoint erweitert und die Nachricht mit neuen Parametern geändert. Hier ist der Code:Replay-Protokoll mit WCF-Technologie

public object BeforeSendRequest(ref Message request, IClientChannel channel) 
      { 
        XmlDocument doc = new XmlDocument(); 
        doc.LoadXml(record.Message.ToString()); 
        var ms = new MemoryStream(); 

        XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(ms); 
        doc.WriteTo(writer); 
        writer.Flush(); 
        ms.Position = 0; 
        XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(ms, XmlDictionaryReaderQuotas.Max); 
        Message newReply = Message.CreateMessage(request.Version, null, reader); 
        newReply.Headers.CopyHeadersFrom(request); 
        request = newReply; 
      } 

Diese Funktion scheint die richtigen Werte zu haben. Aber es kann viele verschiedene Funktionen abhängig von der JSON-Datei aufrufen. Um in der Lage zu sein zu gehen, in diese „BeforeSendRequest“ Methode, Ich brauche eine bestehende Methode zum Beispiel nennen:

m_MyService.XXX(); 

Und weil ich es in „BeforeSendRequest“ ändern, es shoudln't Materie, welche Funktion ich bin hier anrufen. Aber, tut es mir die Fehlermeldung zurück:

System.ServiceModel.CommunicationException: Erreur lors de la désérialisation du corps du message de demande pour l'opération 'XXX'. OperationFormatter a rencontré un corps de Message non valide. Type de nœud 'Element' attendu avec le nom 'XXX' et l'espace de noms 'http://tempuri.org/'. Type de nœud 'Element' trouvé avec le nom 'YYY' et l'espace de noms 'http://tempuri.org/'. ---> System.Runtime.Serialization.SerializationException: OperationFormatter a rencontré un corps de Message non valide. Type de nœud 'Element' attendu avec le nom 'XXX' et l'espace de noms 'http://tempuri.org/'. Type de nœud 'Element' trouvé avec le nom 'YYY' et l'espace de noms 'http://tempuri.org/'. 
    à System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(XmlDictionaryReader reader, Object[] parameters) 
    à System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(Message message, Object[] parameters) 
    --- Fin de la trace de la pile d'exception interne --- 
    à System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(Message message, Object[] parameters) 
    à System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 
    à System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

Es sieht aus wie es nicht mag, wenn der Aufruf der Methode nicht m_MyService.YYY ist();

+0

Der DataContract sollte identisch sein mit dem, was Sie in der Operation angegeben haben. Hier ist Ihr DataContract "xxx", aber Sie ändern ihn zu "yyy". Versuchen Sie, Instanz von 'xxx' zu senden –

+0

Mmmh Ich bin mir nicht sicher, ob ich richtig verstanden habe 'xxx' ist eine Methode. Und wenn ich m_MyService.YYY(); Zuerst wird es funktionieren, aber nur wenn die in BeforeSendRequest geladene Methode m_MyService.YYY() ist; Wenn ich eine andere Methode als YYY anrufe, wird es fehlschlagen. – KingOfBabu

Antwort

0

Ich habe endlich die Lösung gefunden, hoffe, es kann helfen. Ich musste nur die "Aktion" in der Kopfzeile ändern. Fügen Sie also einfach folgende Zeile hinzu:

newReply.Headers.Action = "desiredcontent";