10 Stimmen

Nur den Hauptteil einer WCf-Nachricht abrufen

Ich habe ein paar Probleme mit einem eigentlich einfachen Problem.

Ich habe eine Service-Methode, die in einem c# Message-Typ nimmt und ich möchte nur extrahieren Sie den Körper dieser Soap-Nachricht und verwenden Sie es um eine völlig neue Nachricht zu konstruieren. Ich kann nicht die GetBody<>() Methode für die Klasse Message, da ich nicht weiß, in welchen Typ der Body serialisiert werden soll.

Weiß jemand, wie man den Text aus der Nachricht extrahieren kann? Oder wie man eine neue Nachricht erstellt, die denselben Text enthält, d. h. ohne die Kopfzeile der ursprünglichen Nachricht usw.?

23voto

Yann Schwartz Punkte 5904

Sie können auf den Textkörper der Nachricht zugreifen, indem Sie die Methode GetReaderAtBodyContents für die Nachricht verwenden:

using (XmlDictionaryReader reader = message.GetReaderAtBodyContents())
{
     string content = reader.ReadOuterXml();
     //Other stuff here...                
}

5voto

Ray Vernagus Punkte 6070

Ich möchte der Antwort von Yann nicht vorgreifen, aber hier ist ein vollständiges Beispiel für das Kopieren eines Nachrichtentextes in eine neue Nachricht mit einem anderen Aktions-Header. Sie könnten auch andere Kopfzeilen als Teil des Beispiels hinzufügen oder anpassen. Ich habe zu viel Zeit damit verbracht, das hier zu schreiben, um es einfach wegzuwerfen =)

class Program
{
    [DataContract]
    public class Person
    {
        [DataMember]
        public string FirstName { get; set; }

        [DataMember]
        public string LastName { get; set; }

        public override string ToString()
        {
            return string.Format("{0}, {1}", LastName, FirstName);
        }
    }

    static void Main(string[] args)
    {
        var person = new Person { FirstName = "Joe", LastName = "Schmo" };
        var message = System.ServiceModel.Channels.Message.CreateMessage(MessageVersion.Default, "action", person);

        var reader = message.GetReaderAtBodyContents();
        var newMessage = System.ServiceModel.Channels.Message.CreateMessage(MessageVersion.Default, "newAction", reader);

        Console.WriteLine(message);
        Console.WriteLine();
        Console.WriteLine(newMessage);
        Console.WriteLine();
        Console.WriteLine(newMessage.GetBody<Person>());
        Console.ReadLine();
    }
}

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