Dela via


Skapa en tjänstproxy manuellt för en WCF-tjänst

Det enklaste sättet att skapa en klienttjänstproxy för en WCF-tjänst (Windows Communication Foundation) är på Service Model lager med WsUtil-verktyget, enligt beskrivningen i avsnittet Skapa en klient. Men om det behövs kan du också skapa en serviceproxy manuellt. Det här API:et innehåller en WsCreateServiceProxy--funktion för att skapa tjänstproxyn samt strukturer, uppräkningar och så vidare för att ange de egenskaper som krävs för att samverka med WCF.

WCF tillhandahåller ett antal standardbindningar som var och en riktar sig till ett specifikt användningsscenario. Vilken bindning av tjänsten som du försöker ansluta till använder avgör i sin tur vilka kanalegenskaper du behöver anpassa för att tjänstproxyn ska kunna kommunicera med tjänsten.

Skapa en tjänstproxy för WCF:s WSHttpBinding

WSHttpBinding är avsett för huvudscenariot inom webbtjänster på Internet. Den använder den nyare SOAP-versionen 1.2 och WS-Addressing version 1.0 och möjliggör en mängd olika säkerhetsinställningar för offentliga HTTP- och HTTPS-transporter. WWSAPI har inte en motsvarighet till WSHttpBinding (eller någon av WCF-standardbindningarna för den delen), men eftersom standardversionen av SOAP WS-Addressing version och kodningsformat matchar dem i WSHttpBinding är det enkelt att skapa en tjänstproxy för en tjänst som använder WSHttpBinding. Om du till exempel vill skapa en tjänstproxy för att interagera med en WSHttpBinding-slutpunkt utan säkerhet kan du helt enkelt använda kod som följande kodexempel (variabeldeklaration samt heap och felhantering utelämnas). Observera att inga kanalegenskaper eller säkerhetsbeskrivning anges i anropet till funktionen WsCreateServiceProxy.

// Create the proxy

hr = WsCreateServiceProxy(
        WS_CHANNEL_TYPE_REQUEST, 
        WS_HTTP_CHANNEL_BINDING, 
        NULL, // security description
        NULL, // proxy properties
        0, // proxy property count
        NULL, // channel properties
        0, // channel property count
        &proxy, 
        error);

Funktionen skapar tjänstproxyn och returnerar en pekare till den i parametern serviceProxy (&proxy i funktionsanropet ovan).

Skapa en tjänsteproxy för WCF:s BasicHttpBinding

När du skapar en tjänstproxy manuellt för en WCF-tjänst som använder en BasicHttpBinding-bindning är det dock nödvändigt att ange SOAP-versionen och WS-Addressing egenskaper för kanalen. Det beror på att WWSAPI som standard är SOAP version 1.2 och WS-Addressing 1.0. WCF:s BasicHttpBinding använder å andra sidan SOAP version 1.1 och ingen WS-adressering.

Om du vill ange SOAP-versionen och WS-Addrssing egenskaper för kanalen deklarerar du en matris med WS_CHANNEL_PROPERTY strukturer för att lagra kanalegenskaperna och relaterad information.

WS_CHANNEL_PROPERTY channelProperties[4]; // Array to hold up to 4 channel properties

ULONG channelPropertyCount = 0; // Count of properties set
 
WS_ENVELOPE_VERSION soapVersion = WS_ENVELOPE_VERSION_SOAP_1_1; // Set required SOAP version
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ENVELOPE_VERSION; // Type of first channel property
channelProperties[channelPropertyCount].value = &soapVersion; // Address of the SOAP version value
channelProperties[channelPropertyCount].valueSize = sizeof(soapVersion); // Size of the value
channelPropertyCount++; // Increment property count
 
WS_ADDRESSING_VERSION addressingVersion = WS_ADDRESSING_VERSION_TRANSPORT; // Set required WS-Addressing value
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ADDRESSING_VERSION; // Type of second channel property
channelProperties[channelPropertyCount].value = &addressingVersion ; // Address of the WS-Addressing value
channelProperties[channelPropertyCount].valueSize = sizeof(addressingVersion ); // Size of the value
channelPropertyCount++; // Increment property count
 
// add more channel properties here

Skicka sedan matrisen med kanalegenskaper (channelProperties) och antalet egenskaper (channelPropertyCount) till WsCreateServiceProxy- (eller WsCreateChannel om du arbetar på kanalskiktet).

// Create the proxy

hr = WsCreateServiceProxy(
        WS_CHANNEL_TYPE_REQUEST, 
        WS_HTTP_CHANNEL_BINDING, 
        NULL, // security description
        NULL, // proxy properties
        0, // proxy property count
        channelProperties, // channel properties
        channelPropertyCount, // channel property count
        &proxy, 
        error);

Matrisen som du deklarerade att innehålla egenskaperna kopieras i WsCreateServiceProxy, och därför kan du frigöra minnet för egenskapsmatrisen omedelbart efter att funktionen anropats. Om du allokerar minnet från stacken (till exempel kodfragmentet ovan) kan du också komma tillbaka från funktionen direkt efter anropet.

Andra bindningar

Dessutom tillhandahåller WWSAPI mekanismer för att skapa tjänstproxy för att kommunicera med WCF-tjänster med hjälp av andra bindningar, till exempel NetTcpBinding och WSFederationHttpBinding. Många av dessa bindningar kräver att du anger ytterligare kanalegenskaper, till exempel säkerhetsbeskrivningar. Exempel som illustrerar användning av andra bindningar finns i avsnittet Windows Web Services Examples, , i synnerhet TCP Channel Layer Examples, HTTP Channel Layer Examplesoch Security Channel Layer Examples underavsnitt.