Udostępnij za pośrednictwem


Używanie monikera programu WCF z klientami COM

Przykład COM pokazuje, jak używać moniker usługi Windows Communication Foundation (WCF) w celu zintegrowania usług sieci Web z środowiskami deweloperskimi opartymi na modelu COM, takimi jak Microsoft Office Visual Basic for Applications (Office VBA) lub Visual Basic 6.0. Ten przykład składa się z klienta hosta skryptów systemu Windows (vbs), pomocniczej biblioteki klienta (.dll) i biblioteki usług (.dll) hostowanej przez usługi Internet Information Services (IIS). Usługa jest usługą kalkulatora, a klient COM wywołuje operacje matematyczne — dodawanie, odejmowanie, mnożenie i dzielenie — w usłudze. Działanie klienta jest widoczne w oknach okna komunikatów.

Uwaga

Procedura konfiguracji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

Usługa implementuje ICalculator kontrakt zdefiniowany zgodnie z poniższym przykładem kodu.

[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);
}

W przykładzie przedstawiono trzy alternatywne podejścia do używania pseudonimu:

  • Kontrakt wpisany — kontrakt jest rejestrowany jako typ widoczny com na komputerze klienckim.

  • Kontrakt WSDL — kontrakt jest dostarczany w postaci dokumentu WSDL.

  • Kontrakt wymiany metadanych — kontrakt jest pobierany w czasie wykonywania z punktu końcowego programu Metadata Exchange (MEX).

Typowany kontrakt

Aby użyć nazwy moniker z typowym użyciem kontraktu, należy odpowiednio przypisać typy dla kontraktu usługi muszą być zarejestrowane w modelu COM. Najpierw należy wygenerować klienta przy użyciu narzędzia ServiceModel Metadata Tool (Svcutil.exe). Uruchom następujące polecenie z wiersza polecenia w katalogu klienta, aby wygenerować typowy serwer proxy.

svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples http://localhost/servicemodelsamples/service.svc /out:generatedClient.cs

Ta klasa musi być uwzględniona w projekcie, a projekt powinien być skonfigurowany do generowania zestawu widocznego dla modelu COM, podpisanego podczas kompilowania. W pliku AssemblyInfo.cs należy uwzględnić następujący atrybut.

[assembly: ComVisible(true)]

Po utworzeniu projektu zarejestruj typy widoczne dla modelu COM, jak regasm pokazano w poniższym przykładzie.

regasm.exe /tlb:CalcProxy.tlb client.dll

Utworzony zestaw powinien zostać dodany do globalnej pamięci podręcznej zestawów. Chociaż nie jest to ściśle wymagane, upraszcza to proces lokalizowania zestawu przez środowisko uruchomieniowe. Następujące polecenie dodaje zestaw do globalnej pamięci podręcznej zestawów.

gacutil.exe /i client.dll

Uwaga

Moniker usługi wymaga tylko rejestracji typu i nie używa serwera proxy do komunikowania się z usługą.

Aplikacja kliencka ComCalcClient.vbs używa GetObject funkcji do konstruowania serwera proxy dla usługi przy użyciu składni moniker usługi w celu określenia adresu, powiązania i kontraktu dla usługi.

Set typedServiceMoniker = GetObject(
"service4:address=http://localhost/ServiceModelSamples/service.svc, binding=wsHttpBinding,
contractType={9213C6D2-5A6F-3D26-839B-3BA9B82228D3}")

Parametry używane przez moniker określają:

  • Adres punktu końcowego usługi.

  • Powiązanie, którego klient powinien użyć do nawiązania połączenia z tym punktem końcowym. W takim przypadku zdefiniowany system wsHttpBinding jest używany, chociaż powiązania niestandardowe można zdefiniować w plikach konfiguracji klienta. Do użycia z hostem skryptów systemu Windows powiązanie niestandardowe jest definiowane w pliku Cscript.exe.config w tym samym katalogu co Cscript.exe.

  • Typ kontraktu obsługiwanego w punkcie końcowym. Jest to typ, który został wygenerowany i zarejestrowany powyżej. Ponieważ skrypt języka Visual Basic nie zapewnia silnie typizowanego środowiska COM, należy określić identyfikator kontraktu. Ten identyfikator GUID jest z interfaceID pliku CalcProxy.tlb, który można wyświetlić za pomocą narzędzi COM, takich jak przeglądarka obiektów OLE/COM (OleView.exe). W przypadku silnie typiowanych środowisk, takich jak Office VBA lub Visual Basic 6.0, dodanie jawnego odwołania do biblioteki typów, a następnie zadeklarowanie typu obiektu proxy może być używane zamiast parametru kontraktu. Zapewnia to również obsługę funkcji IntelliSense podczas tworzenia aplikacji klienckich.

Po utworzeniu wystąpienia serwera proxy za pomocą nazwy moniker usługi aplikacja kliencka może wywołać metody na serwerze proxy, co powoduje wywołanie infrastruktury moniker usługi wywołującej odpowiednie operacje usługi.

' Call the service operations using the moniker object
WScript.Echo "Typed service moniker: 100 + 15.99 = " & typedServiceMoniker.Add(100, 15.99)

Po uruchomieniu przykładu odpowiedź operacji jest wyświetlana w oknie komunikatu Hosta skryptu systemu Windows. Pokazuje to, że klient COM wykonuje wywołania COM przy użyciu wpisanego monikera do komunikowania się z usługą WCF. Pomimo użycia modelu COM w aplikacji klienckiej komunikacja z usługą składa się tylko z wywołań usługi sieci Web.

Kontrakt WSDL

Aby użyć nazwy moniker z kontraktem WSDL, rejestracja biblioteki klienta nie jest wymagana, ale kontrakt WSDL dla usługi musi zostać pobrany za pośrednictwem mechanizmu poza pasmem, takiego jak używanie przeglądarki w celu uzyskania dostępu do punktu końcowego WSDL dla usługi. Pseudonim może następnie uzyskać dostęp do tego kontraktu w czasie wykonywania.

Aplikacja kliencka ComCalcClient.vbs używa klasy , FileSystemObject aby uzyskać dostęp do lokalnie zapisanego pliku WSDL, a następnie ponownie używa GetObject funkcji do konstruowania serwera proxy dla usługi.

' 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)

Parametry używane przez moniker określają:

  • Adres punktu końcowego usługi.

  • Powiązanie, którego klient powinien użyć do nawiązania połączenia z tym punktem końcowym i przestrzenią nazw, w której zdefiniowano to powiązanie. W tym przypadku wsHttpBinding_ICalculator parametr jest używany.

  • WSDL definiujący kontrakt. W tym przypadku jest to ciąg odczytany z pliku serviceWsdl.xml.

  • Nazwa i przestrzeń nazw kontraktu. Ta identyfikacja jest wymagana, ponieważ plik WSDL może zawierać więcej niż jeden kontrakt.

    Uwaga

    Domyślnie usługi WCF generują oddzielne pliki WSDL dla każdej używanej przestrzeni nazw. Są one połączone z użyciem konstrukcji importu WSDL. Ponieważ moniker oczekuje pojedynczej definicji WSDL, usługa musi użyć jednej przestrzeni nazw, jak pokazano w tym przykładzie, lub oddzielne pliki muszą zostać scalone ręcznie.

Po utworzeniu wystąpienia serwera proxy za pomocą nazwy moniker usługi aplikacja kliencka może wywołać metody na serwerze proxy, co powoduje wywołanie infrastruktury moniker usługi wywołującej odpowiednie operacje usługi.

' Call the service operations using the moniker object
WScript.Echo "WSDL service moniker: 145 - 76.54 = " & wsdlServiceMoniker.Subtract(145, 76.54)

Po uruchomieniu przykładu odpowiedź operacji jest wyświetlana w oknie komunikatu Hosta skryptu systemu Windows. Przedstawia to klienta COM wykonującego wywołania COM przy użyciu nazwy moniker z kontraktem WSDL w celu komunikowania się z usługą WCF.

Kontrakt wymiany metadanych

Aby używać pseudonimu z kontraktem MEX, podobnie jak w przypadku kontraktu WSDL, rejestracja klienta nie jest wymagana. Kontrakt dla usługi jest pobierany w czasie wykonywania za pośrednictwem wewnętrznego użycia programu Metadata Exchange.

Aplikacja kliencka ComCalcClient.vbs ponownie używa GetObject funkcji do konstruowania serwera proxy dla usługi.

' 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)

Parametry używane przez moniker określają:

  • Adres punktu końcowego wymiany metadanych usługi.

  • Adres punktu końcowego usługi.

  • Powiązanie, którego klient powinien użyć do nawiązania połączenia z tym punktem końcowym i przestrzenią nazw, w której zdefiniowano to powiązanie. W tym przypadku wsHttpBinding_ICalculator parametr jest używany.

  • Nazwa i przestrzeń nazw kontraktu. Ta identyfikacja jest wymagana, ponieważ plik WSDL może zawierać więcej niż jeden kontrakt.

Po utworzeniu wystąpienia serwera proxy za pomocą nazwy moniker usługi aplikacja kliencka może wywołać metody na serwerze proxy, co powoduje wywołanie infrastruktury moniker usługi wywołującej odpowiednie operacje usługi.

' Call the service operations using the moniker object
WScript.Echo "MEX service moniker: 9 * 81.25 = " & mexServiceMoniker.Multiply(9, 81.25)

Po uruchomieniu przykładu odpowiedź operacji jest wyświetlana w oknie komunikatu Hosta skryptu systemu Windows. Przedstawia to klienta COM wykonującego wywołania COM przy użyciu nazwy moniker z kontraktem MEX w celu komunikowania się z usługą WCF.

Aby skonfigurować i skompilować przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. W wierszu polecenia dewelopera dla programu Visual Studio otwórz folder \client\bin w folderze specyficznym dla języka.

    Uwaga

    Jeśli używasz systemu Windows Vista, Windows Server 2008, Windows 7 lub Windows Server 2008 R2, upewnij się, że uruchamiasz wiersz polecenia z uprawnieniami administratora.

  4. Wpisz polecenie , tlbexp.exe client.dll /out:CalcProxy.tlb aby wyeksportować bibliotekę dll do pliku tlb. Oczekiwano ostrzeżenia eksportera biblioteki typów, ale nie jest to problem, ponieważ typ ogólny nie jest wymagany.

  5. Wpisz polecenie , regasm.exe /tlb:CalcProxy.tlb client.dll aby zarejestrować typy za pomocą modelu COM. Oczekiwano ostrzeżenia eksportera biblioteki typów, ale nie jest to problem, ponieważ typ ogólny nie jest wymagany.

  6. Wpisz polecenie , gacutil.exe /i client.dll aby dodać zestaw do globalnej pamięci podręcznej zestawów.

Aby uruchomić przykład na tym samym komputerze

  1. Przetestuj, czy możesz uzyskać dostęp do usługi przy użyciu przeglądarki, wpisując następujący adres: http://localhost/servicemodelsamples/service.svc. W odpowiedzi powinna zostać wyświetlona strona potwierdzenia.

  2. Uruchom plik ComCalcClient.vbs z folderu \client z folderu specyficznego dla języka. Działanie klienta jest wyświetlane w oknach oknach okna komunikatów.

  3. Jeśli klient i usługa nie mogą się komunikować, zobacz Rozwiązywanie problemów Wskazówki dla przykładów programu WCF.

Aby uruchomić przykład na komputerach

  1. Na komputerze usługi utwórz katalog wirtualny o nazwie ServiceModelSamples. Skrypt Setupvroot.bat dołączony do przykładu może służyć do tworzenia katalogu dysków i katalogu wirtualnego.

  2. Skopiuj pliki programu usługi z folderu %SystemDrive%\Inetpub\wwwroot\servicemodelsamples do katalogu wirtualnego ServiceModelSamples na komputerze usługi. Pamiętaj, aby uwzględnić pliki w katalogu \bin.

  3. Skopiuj plik skryptu klienta z folderu \client w folderze specyficznym dla języka do komputera klienckiego.

  4. W pliku skryptu zmień wartość adresu definicji punktu końcowego, aby odpowiadała nowemu adresowi usługi. Zastąp wszystkie odwołania do "localhost" w pełni kwalifikowaną nazwą domeny w adresie.

  5. Skopiuj plik WSDL na komputer kliencki. W pliku WSDL serviceWsdl.xml zastąp wszystkie odwołania do "localhost" w pełni kwalifikowaną nazwą domeny w adresie.

  6. Skopiuj bibliotekę Client.dll z folderu \client\bin w folderze specyficznym dla języka do katalogu na komputerze klienckim.

  7. W wierszu polecenia przejdź do tego katalogu docelowego na komputerze klienckim. Jeśli używasz systemu Windows Vista lub Windows Server 2008, upewnij się, że uruchom wiersz polecenia jako Administracja istrator.

  8. Wpisz polecenie , tlbexp.exe client.dll /out:CalcProxy.tlb aby wyeksportować bibliotekę dll do pliku tlb. Oczekiwano ostrzeżenia eksportera biblioteki typów, ale nie jest to problem, ponieważ typ ogólny nie jest wymagany.

  9. Wpisz polecenie , regasm.exe /tlb:CalcProxy.tlb client.dll aby zarejestrować typy za pomocą modelu COM. Upewnij się, że ścieżka została ustawiona na folder zawierający regasm.exe przed uruchomieniem polecenia.

  10. Wpisz polecenie , gacutil.exe /i client.dll aby dodać zestaw do globalnej pamięci podręcznej zestawów. Upewnij się, że ścieżka została ustawiona na folder zawierający gacutil.exe przed uruchomieniem polecenia.

  11. Przetestuj dostęp do usługi z komputera klienckiego przy użyciu przeglądarki.

  12. Na komputerze klienckim uruchom plik ComCalcClient.vbs.

Aby wyczyścić po próbce

Na potrzeby zabezpieczeń usuń definicję katalogu wirtualnego i uprawnienia przyznane w krokach konfiguracji po zakończeniu pracy z przykładami.