Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az OperationContextScope minta bemutatja, hogyan küldhet további információkat egy Windows Communication Foundation (WCF) híváson keresztül fejlécekkel. Ebben a mintában a kiszolgáló és az ügyfél egyaránt konzolalkalmazás.
Megjegyzés:
A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.
A minta bemutatja, hogyan küldhet az ügyfél további információkat MessageHeader a OperationContextScope használatával. Az OperationContextScope objektumot úgy hozza létre, hogy egy csatornára hatókört ad. A távoli szolgáltatásba lefordítandó fejlécek hozzáadhatók a OutgoingMessageHeaders gyűjteményhez. A gyűjteményhez hozzáadott fejlécek lekérhetők a szolgáltatásban a hozzáféréssel IncomingMessageHeaders. A hívások több csatornán futnak, majd az ügyfélhez hozzáadott fejlécek csak arra a csatornára vonatkoznak, amelyet a OperationContextScope létrehozásához használtak.
MessageHeaderReader
Ez a mintaszolgáltatás, amely üzenetet kap az ügyféltől, és megpróbálja megkeresni a fejlécet a IncomingMessageHeaders gyűjteményben. Az ügyfél átadja a fejlécben elküldött GUID-azonosítót, és a szolgáltatás lekéri az egyéni fejlécet, majd, ha van ilyen, összehasonlítja azt az ügyfél által paraméterként átadott GUID-azonosítóval.
public bool RetrieveHeader(string guid)
{
MessageHeaders messageHeaderCollection =
OperationContext.Current.IncomingMessageHeaders;
String guidHeader = null;
Console.WriteLine("Trying to check if IncomingMessageHeader " +
" collection contains header with value {0}", guid);
if (messageHeaderCollection.FindHeader(
CustomHeader.HeaderName,
CustomHeader.HeaderNamespace) != -1)
{
guidHeader = messageHeaderCollection.GetHeader<String>(
CustomHeader.HeaderName, CustomHeader.HeaderNamespace);
}
else
{
Console.WriteLine("No header was found");
}
if (guidHeader != null)
{
Console.WriteLine("Found header with value {0}. "+
"Does it match with GUID sent as parameter: {1}",
guidHeader, guidHeader.Equals(guid));
}
Console.WriteLine();
//Return true if header is present and equals the guid sent by
// client as argument
return (guidHeader != null && guidHeader.Equals(guid));
}
MessageHeaderClient
Ez az az ügyfél-implementáció, amely a ServiceModel Metadata Segédprogram által létrehozott proxyt (Svcutil.exe) használja a távoli szolgáltatással való kommunikációhoz. Először két proxyobjektumot hoz létre.MessageHeaderReaderClient
//Create two clients to the remote service.
MessageHeaderReaderClient client1 = new MessageHeaderReaderClient();
MessageHeaderReaderClient client2 = new MessageHeaderReaderClient();
Az ügyfél ezután létrehoz egy OperationContextScope objektumot, és hatókörbe állítja azt a(z) client1 elemhez. Hozzáad egy MessageHeader-t a OutgoingMessageHeaders-hez, és egy hívást kezdeményez mindkét ügyfélen. Annak ellenőrzésével, hogy a client1 hívás visszatérési értéke, biztosítja, hogy a fejléc csak client2 legyen elküldve, és ne legyen elküldve RetrieveHeader-re.
using (new OperationContextScope(client1.InnerChannel))
{
//Create a new GUID that is sent as the header.
String guid = Guid.NewGuid().ToString();
//Create a MessageHeader for the GUID we just created.
MessageHeader customHeader = MessageHeader.CreateHeader(CustomHeader.HeaderName, CustomHeader.HeaderNamespace, guid);
//Add the header to the OutgoingMessageHeader collection.
OperationContext.Current.OutgoingMessageHeaders.Add(customHeader);
//Now call RetrieveHeader on both the proxies. Since the OperationContextScope is tied to
//client1's InnerChannel, the header should only be added to calls made on that client.
//Calls made on client2 should not be sending the header across even though the call
//is made in the same OperationContextScope.
Console.WriteLine("Using client1 to send message");
Console.WriteLine("Did server retrieve the header? : Actual: {0}, Expected: True", client1.RetrieveHeader(guid));
Console.WriteLine();
Console.WriteLine("Using client2 to send message");
Console.WriteLine("Did server retrieve the header? : Actual: {0}, Expected: False", client2.RetrieveHeader(guid));
}
Ez a minta saját üzemeltetésű. A minta futtatásának következő mintakimenete érhető el:
Prompt> Service.exe
The service is ready.
Press <ENTER> to terminate service.
Trying to check if IncomingMessageHeader collection contains header with value 2239da67-546f-42d4-89dc-8eb3c06215d8
Found header with value 2239da67-546f-42d4-89dc-8eb3c06215d8. Does it match with GUID sent as parameter: True
Trying to check if IncomingMessageHeader collection contains header with value 2239da67-546f-42d4-89dc-8eb3c06215d8
No header was found
Prompt>Client.exe
Using client1 to send message
Did server retrieve the header? : Actual: True, Expected: True
Using client2 to send message
Did server retrieve the header? : Actual: False, Expected: False
Press <ENTER> to terminate client.
A példa beállítása, elkészítése és futtatása
Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.
A megoldás C# vagy Visual Basic .NET kiadásának létrehozásához kövesse Windows Communication Foundation-mintákcímű témakör utasításait.
Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse A Windows Communication Foundation-minták futtatásacímű témakör utasításait.