Wie kann ich einen benutzerdefinierten SOAP-Header in WCF deserialisieren?

Ich versuche, allen SOAP-Anforderungen über WCF einen benutzerdefinierten Header hinzuzufügen. ich fandDieser fantastische Artikel wie man genau das macht. MeineMessageHeader Klasse sieht so aus:

public class OperatorNameMessageHeader : MessageHeader
{
    private string opName;

    public const string HeaderName = "OperatorNameMessageHeader";
    public const string HeaderNamespace = "http://schemas.microsoft.com/scout";

    public override string Name { get { return HeaderName; } }
    public override string Namespace { get { return HeaderNamespace; } }

    public string OperatorName
    {
        get { return opName; }
        set { opName = value; }
    }

    public OperatorNameMessageHeader()
    {
    }

    public OperatorNameMessageHeader(string operatorName)
    {
        opName = operatorName;
    }

    protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
    {
        writer.WriteElementString("OperatorName", opName);
    }
}

Eins macht der Artikelnicht sagen ist wie manlesen der Wert auf dem Server. Gemäßdieser Beitragkönnen Sie verwendenOperationContext.Current.IncomingMessageHeaders um diese Header zu lesen. Wenn ich diese anschaueMessageHeaders Unter dem Debugger werden 3 Header angezeigt, einschließlich meines benutzerdefinierten. Es wird also definitiv in den SOAP-Daten angezeigt. Allerdings, wenn ich anrufeGetHeader:

OperatorNameMessageHeader test = msgHeaders.GetHeader<OperatorNameMessageHeader>(OperatorNameMessageHeader.HeaderName, OperatorNameMessageHeader.HeaderNamespace);

Danntest.OperatorName ist Null. Grundsätzlich bekomme ich gerade eine leere zurückOperatorNameMessageHeader Objekt, das nicht aus den Daten im SOAP deserialisiert wurde.

Mein nächster Schritt war das Ausführen des WCF-Ablaufverfolgungstools. Wenn ich das mache, kann ich überprüfen, ob der benutzerdefinierte Header isttatsächlich Wird über die Leitung gesendet:

<MessageHeaders>
   <ActivityId CorrelationId="66a7c5b6-3548-4f3c-9120-4484af76b64b" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">f9bef03b-4e7b-4e84-b327-5e79814d9933</ActivityId>
   <OperatorNameMessageHeader xmlns="http://schemas.microsoft.com/scout">
      <OperatorName>Correct Operator Name</OperatorName>
   </OperatorNameMessageHeader>
   <To d4p1:mustUnderstand="1" xmlns:d4p1="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:90/IRolesAndResourcesManager</To>
   <Action d4p1:mustUnderstand="1" xmlns:d4p1="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IRolesAndResourcesManager/Authenticate</Action>
</MessageHeaders>

Also der Serverhat Die Daten kann ich einfach nichtbekommen dazu. Was ist die Lösung für dieses Problem?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage