WCF Moniker gebruiken met COM-clients
In het COM-voorbeeld ziet u hoe u de WCF-service moniker (Windows Communication Foundation) gebruikt om webservices te integreren in com-ontwikkelomgevingen, zoals Microsoft Office Visual Basic for Applications (Office VBA) of Visual Basic 6.0. Dit voorbeeld bestaat uit een Windows Script Host-client (.vbs), een ondersteunende clientbibliotheek (.dll) en een servicebibliotheek (.dll) die wordt gehost door Internet Information Services (IIS). De service is een rekenmachineservice en de COM-client roept wiskundige bewerkingen aan( optellen, aftrekken, vermenigvuldigen en delen) op de service. Clientactiviteit is zichtbaar in de berichtenvakvensters.
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
De service implementeert een ICalculator
contract dat is gedefinieerd zoals wordt weergegeven in het volgende codevoorbeeld.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
In het voorbeeld ziet u de drie alternatieve benaderingen voor het gebruik van de moniker:
Getypt contract : het contract is geregistreerd als een com-zichtbaar type op de clientcomputer.
WSDL-contract – Het contract wordt verstrekt in de vorm van een WSDL-document.
Metadata Exchange-contract: het contract wordt opgehaald tijdens runtime van een MEX-eindpunt (Metadata Exchange).
Getypt contract
Als u de moniker wilt gebruiken met een getypeerd contractgebruik, moeten de juiste typen voor het servicecontract worden geregistreerd bij COM. Eerst moet een client worden gegenereerd met behulp van het hulpprogramma ServiceModel Metadata Utility (Svcutil.exe). Voer de volgende opdracht uit vanaf een opdrachtprompt in de clientmap om de getypte proxy te genereren.
svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples http://localhost/servicemodelsamples/service.svc /out:generatedClient.cs
Deze klasse moet worden opgenomen in een project en het project moet worden geconfigureerd om een com-zichtbare, ondertekende assembly te genereren wanneer deze wordt gecompileerd. Het volgende kenmerk moet worden opgenomen in het AssemblyInfo.cs-bestand.
[assembly: ComVisible(true)]
Nadat u het project hebt gebouwd, registreert u de com-zichtbare typen met behulp van het regasm
volgende voorbeeld.
regasm.exe /tlb:CalcProxy.tlb client.dll
De assembly die wordt gemaakt, moet worden toegevoegd aan de Global Assembly Cache. Hoewel dit niet strikt vereist is, vereenvoudigt dit het proces van de runtime voor het vinden van de assembly. Met de volgende opdracht wordt de assembly toegevoegd aan de Global Assembly Cache.
gacutil.exe /i client.dll
Notitie
De service-moniker vereist alleen de typeregistratie en gebruikt de proxy niet om met de service te communiceren.
ComCalcClient.vbs-clienttoepassing gebruikt de GetObject
functie om een proxy voor de service te maken, met behulp van de syntaxis van de service moniker om het adres, de binding en het contract voor de service op te geven.
Set typedServiceMoniker = GetObject(
"service4:address=http://localhost/ServiceModelSamples/service.svc, binding=wsHttpBinding,
contractType={9213C6D2-5A6F-3D26-839B-3BA9B82228D3}")
De parameters die worden gebruikt door de moniker opgeven:
Het adres van het service-eindpunt.
De binding die de client moet gebruiken om verbinding te maken met dat eindpunt. In dit geval wordt de door het systeem gedefinieerde wsHttpBinding gebruikt, maar aangepaste bindingen kunnen worden gedefinieerd in clientconfiguratiebestanden. Voor gebruik met de Windows Script Host wordt de aangepaste binding gedefinieerd in een Cscript.exe.config-bestand in dezelfde map als Cscript.exe.
Het type contract dat wordt ondersteund op het eindpunt. Dit is het type dat hierboven is gegenereerd en geregistreerd. Omdat Visual Basic-script geen sterk getypeerde COM-omgeving biedt, moet er een id voor het contract worden opgegeven. Deze GUID is de
interfaceID
CalcProxy.tlb, die kan worden weergegeven met com-hulpprogramma's zoals de OLE/COM-objectviewer (OleView.exe). Voor sterk getypte omgevingen, zoals Office VBA of Visual Basic 6.0, voegt u een expliciete verwijzing toe naar de typebibliotheek en kunt u vervolgens het type van het proxyobject declareren in plaats van de contractparameter. Dit biedt ook IntelliSense-ondersteuning tijdens het ontwikkelen van clienttoepassingen.
Nadat het proxy-exemplaar is samengesteld met de service-moniker, kan de clienttoepassing methoden aanroepen op de proxy, wat resulteert in de service moniker-infrastructuur die de bijbehorende servicebewerkingen aanroept.
' Call the service operations using the moniker object
WScript.Echo "Typed service moniker: 100 + 15.99 = " & typedServiceMoniker.Add(100, 15.99)
Wanneer u het voorbeeld uitvoert, wordt het antwoord van de bewerking weergegeven in een windows Script Host-berichtvenster. Dit demonstreert een COM-client die COM-aanroepen doet met behulp van de getypte moniker om te communiceren met een WCF-service. Ondanks het gebruik van COM in de clienttoepassing bestaat de communicatie met de service alleen uit webservice-aanroepen.
WSDL-contract
Als u de moniker wilt gebruiken met een WSDL-contract, is er geen registratie van de clientbibliotheek vereist, maar moet het WSDL-contract voor de service worden opgehaald via een out-of-band-mechanisme, zoals het gebruik van een browser voor toegang tot het WSDL-eindpunt voor de service. De moniker kan vervolgens toegang krijgen tot dat contract tijdens de uitvoering.
De ComCalcClient.vbs-clienttoepassing gebruikt de FileSystemObject
clienttoepassing voor toegang tot het lokaal opgeslagen WSDL-bestand en gebruikt vervolgens opnieuw de GetObject
functie om een proxy voor de service te maken.
' Open the WSDL contract file and read it all into the wsdlContract string
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("serviceWsdl.xml", ForReading)
wsdlContract = objFile.ReadAll
objFile.Close
' Create a string for the service moniker including the content of the WSDL contract file
wsdlMonikerString = "service4:address='http://localhost/ServiceModelSamples/service.svc'"
wsdlMonikerString = wsdlMonikerString + ", binding=WSHttpBinding_ICalculator, bindingNamespace='http://Microsoft.ServiceModel.Samples'"
wsdlMonikerString = wsdlMonikerString + ", wsdl='" & wsdlContract & "'"
wsdlMonikerString = wsdlMonikerString + ", contract=ICalculator, contractNamespace='http://Microsoft.ServiceModel.Samples'"
' Create the service moniker object
Set wsdlServiceMoniker = GetObject(wsdlMonikerString)
De parameters die worden gebruikt door de moniker opgeven:
Het adres van het service-eindpunt.
De binding die de client moet gebruiken om verbinding te maken met dat eindpunt en de naamruimte waarin die binding is gedefinieerd. In dit geval wordt het
wsHttpBinding_ICalculator
gebruikt.De WSDL die het contract definieert. In dit geval is dit de tekenreeks die is gelezen uit het serviceWsdl.xml-bestand.
De naam en naamruimte van het contract. Deze identificatie is vereist omdat de WSDL meer dan één contract kan bevatten.
Notitie
WCF-services genereren standaard afzonderlijke WSDL-bestanden voor elke naamruimte die door het gebruik wordt gebruikt. Deze zijn gekoppeld aan het gebruik van de WSDL-importconstructie. Omdat de moniker één WSDL-definitie verwacht, moet de service één naamruimte gebruiken zoals in dit voorbeeld wordt gedemonstreerd of moeten de afzonderlijke bestanden handmatig worden samengevoegd.
Nadat het proxy-exemplaar is samengesteld met de service-moniker, kan de clienttoepassing methoden aanroepen op de proxy, wat resulteert in de service moniker-infrastructuur die de bijbehorende servicebewerkingen aanroept.
' Call the service operations using the moniker object
WScript.Echo "WSDL service moniker: 145 - 76.54 = " & wsdlServiceMoniker.Subtract(145, 76.54)
Wanneer u het voorbeeld uitvoert, wordt het antwoord van de bewerking weergegeven in een windows Script Host-berichtvenster. Dit demonstreert een COM-client die COM-aanroepen doet met behulp van de moniker met een WSDL-contract om te communiceren met een WCF-service.
Exchange-contract voor metagegevens
Voor het gebruik van de moniker met een MEX-contract, zoals bij het WSDL-contract, is er geen clientregistratie vereist. Het contract voor de service wordt opgehaald tijdens de uitvoering via het interne gebruik van Metadata Exchange.
De ComCalcClient.vbs-clienttoepassing gebruikt opnieuw de GetObject
functie om een proxy voor de service te maken.
' Create a string for the service moniker specifying the address to retrieve the service metadata from
mexMonikerString = "service4:mexAddress='http://localhost/servicemodelsamples/service.svc/mex'"
mexMonikerString = mexMonikerString + ", address='http://localhost/ServiceModelSamples/service.svc'"
mexMonikerString = mexMonikerString + ", binding=WSHttpBinding_ICalculator, bindingNamespace='http://Microsoft.ServiceModel.Samples'"
mexMonikerString = mexMonikerString + ", contract=ICalculator, contractNamespace='http://Microsoft.ServiceModel.Samples'"
' Create the service moniker object
Set mexServiceMoniker = GetObject(mexMonikerString)
De parameters die worden gebruikt door de moniker opgeven:
Het adres van het eindpunt voor het uitwisselen van servicemetagegevens.
Het adres van het service-eindpunt.
De binding die de client moet gebruiken om verbinding te maken met dat eindpunt en de naamruimte waarin die binding is gedefinieerd. In dit geval wordt het
wsHttpBinding_ICalculator
gebruikt.De naam en naamruimte van het contract. Deze identificatie is vereist omdat de WSDL meer dan één contract kan bevatten.
Nadat het proxy-exemplaar is samengesteld met de service-moniker, kan de clienttoepassing methoden aanroepen op de proxy, wat resulteert in de service moniker-infrastructuur die de bijbehorende servicebewerkingen aanroept.
' Call the service operations using the moniker object
WScript.Echo "MEX service moniker: 9 * 81.25 = " & mexServiceMoniker.Multiply(9, 81.25)
Wanneer u het voorbeeld uitvoert, wordt het antwoord van de bewerking weergegeven in een windows Script Host-berichtvenster. Dit demonstreert een COM-client die COM-aanroepen doet met behulp van de moniker met een MEX-contract om te communiceren met een WCF-service.
Het voorbeeld instellen en bouwen
Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.
Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.
Open vanuit een opdrachtprompt voor Ontwikkelaars voor Visual Studio de map \client\bin, onder de taalspecifieke map.
Notitie
Als u Windows Vista, Windows Server 2008, Windows 7 of Windows Server 2008 R2 gebruikt, controleert u of u de opdrachtprompt met beheerdersbevoegdheden uitvoert.
Typ in
tlbexp.exe client.dll /out:CalcProxy.tlb
om het dll-bestand te exporteren naar een tlb-bestand. Er wordt een waarschuwing voor de typebibliotheekexporteur verwacht, maar is geen probleem omdat het algemene type niet vereist is.Typ in
regasm.exe /tlb:CalcProxy.tlb client.dll
om de typen te registreren bij COM. Er wordt een waarschuwing voor de typebibliotheekexporteur verwacht, maar is geen probleem omdat het algemene type niet vereist is.Typ in
gacutil.exe /i client.dll
om de assembly toe te voegen aan de Global Assembly Cache.
Het voorbeeld uitvoeren op dezelfde computer
Test of u toegang hebt tot de service met behulp van een browser door het volgende adres te typen:
http://localhost/servicemodelsamples/service.svc
Er moet een bevestigingspagina worden weergegeven als antwoord.Voer ComCalcClient.vbs uit vanuit \client, vanuit de taalspecifieke map. Clientactiviteit wordt weergegeven in berichtenvakvensters.
Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.
Het voorbeeld uitvoeren op computers
Maak op de servicecomputer een virtuele map met de naam ServiceModelSamples. Het Setupvroot.bat script dat is opgenomen in het voorbeeld, kan worden gebruikt om de schijfmap en virtuele map te maken.
Kopieer de serviceprogrammabestanden van %SystemDrive%\Inetpub\wwwroot\servicemodelsamples naar de virtuele map ServiceModelSamples op de servicecomputer. Zorg ervoor dat u de bestanden in de map \bin opneemt.
Kopieer het clientscriptbestand uit de map \client, onder de taalspecifieke map, naar de clientcomputer.
Wijzig in het scriptbestand de adreswaarde van de eindpuntdefinitie zodat deze overeenkomt met het nieuwe adres van uw service. Vervang alle verwijzingen naar 'localhost' door een volledig gekwalificeerde domeinnaam in het adres.
Kopieer het WSDL-bestand naar de clientcomputer. Vervang in het WSDL-bestand serviceWsdl.xml alle verwijzingen naar 'localhost' door een volledig gekwalificeerde domeinnaam in het adres.
Kopieer de Client.dll bibliotheek uit de map \client\bin, onder de taalspecifieke map, naar een map op de clientcomputer.
Navigeer vanaf een opdrachtprompt naar die doelmap op de clientcomputer. Als u Windows Vista of Windows Server 2008 gebruikt, moet u de opdrachtprompt uitvoeren als Beheer istrator.
Typ in
tlbexp.exe client.dll /out:CalcProxy.tlb
om het dll-bestand te exporteren naar een tlb-bestand. Er wordt een waarschuwing voor de typebibliotheekexporteur verwacht, maar is geen probleem omdat het algemene type niet vereist is.Typ in
regasm.exe /tlb:CalcProxy.tlb client.dll
om de typen te registreren bij COM. Zorg ervoor dat het pad is ingesteld op de map die bevatregasm.exe
voordat u de opdracht uitvoert.Typ in
gacutil.exe /i client.dll
om de assembly toe te voegen aan de Global Assembly Cache. Zorg ervoor dat het pad is ingesteld op de map die bevatgacutil.exe
voordat u de opdracht uitvoert.Test of u toegang hebt tot de service vanaf de clientcomputer met behulp van een browser.
Start ComCalcClient.vbs op de clientcomputer.
Opschonen na het voorbeeld
Verwijder voor beveiligingsdoeleinden de definitie van de virtuele map en machtigingen die zijn verleend in de installatiestappen wanneer u klaar bent met de voorbeelden.