Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
CustomMexEndpoint-exemplet visar hur du implementerar en tjänst med en säker metadataslutpunkt som använder en av icke-metadatautbytesbindningarna och hur du konfigurerar ServiceModel Metadata Utility Tool (Svcutil.exe) eller klienter för att hämta metadata från en sådan metadataslutpunkt. Det finns två bindningar som tillhandahålls av systemet för att exponera metadataslutpunkter: mexHttpBinding och mexHttpsBinding. mexHttpBinding används för att exponera en metadataslutpunkt via HTTP på ett icke-säkert sätt. mexHttpsBinding används för att exponera en metadataslutpunkt via HTTPS på ett säkert sätt. Det här exemplet visar hur du exponerar en säker metadataslutpunkt med hjälp av WSHttpBinding. Du skulle vilja göra detta när du vill ändra säkerhetsinställningarna för bindningen, men du inte vill använda HTTPS. Om du använder mexHttpsBinding kommer metadataslutpunkten att vara säker, men det finns inget sätt att ändra bindningsinställningarna.
Anmärkning
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
Tjänster
Tjänsten i det här exemplet har två slutpunkter. Programslutpunkten hanterar ICalculator
kontraktet på en WSHttpBinding
med ReliableSession
aktiverad och Message
säkerhet med hjälp av certifikat. Metadataslutpunkten använder WSHttpBinding
också , med samma säkerhetsinställningar men utan ReliableSession
. Här är den relevanta konfigurationen:
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<!-- use base address provided by host -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding2"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<endpoint address="mex"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
<binding name="Binding2">
<reliableSession inactivityTimeout="00:01:00" enabled="true" />
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
I många av de andra exemplen använder metadataslutpunkten standardvärdet mexHttpBinding
, som inte är säker. Här skyddas metadata med WSHttpBinding
och Message
säkerhet. För att metadataklienter ska kunna hämta dessa metadata måste de konfigureras med en matchande bindning. Det här exemplet visar två sådana klienter.
Den första klienten använder Svcutil.exe för att hämta metadata och generera klientkod och konfiguration vid designtillfället. Eftersom tjänsten använder en icke-standardbindning för metadata måste Svcutil.exe-verktyget konfigureras specifikt så att det kan hämta metadata från tjänsten med hjälp av bindningen.
Den andra klienten använder MetadataResolver
för att dynamiskt hämta metadata för ett känt kontrakt och sedan anropa åtgärder på den dynamiskt genererade klienten.
Svcutil-klient
När du använder standardbindningen som värd för slutpunkten IMetadataExchange
kan du köra Svcutil.exe med adressen för slutpunkten:
svcutil http://localhost/servicemodelsamples/service.svc/mex
och det fungerar. Men i det här exemplet använder servern en slutpunkt som inte är standard för att vara värd för metadata. Därför måste Svcutil.exe instrueras att använda rätt bindning. Detta kan göras med hjälp av en Svcutil.exe.config fil.
Filen Svcutil.exe.config ser ut som en normal klientkonfigurationsfil. De enda ovanliga aspekterna är klientens slutpunktsnamn och kontrakt:
<endpoint name="http"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
behaviorConfiguration="ClientCertificateBehavior"
contract="IMetadataExchange" />
Slutpunktsnamnet måste vara namnet på schemat för den adress där metadata finns och slutpunktskontraktet måste vara IMetadataExchange
. När Svcutil.exe körs med en kommandorad, till exempel följande:
svcutil http://localhost/servicemodelsamples/service.svc/mex
den söker efter slutpunkten med namnet "http" och kontrakt IMetadataExchange
för att konfigurera bindningen och beteendet för kommunikationsutbytet med metadataslutpunkten. Resten av Svcutil.exe.config filen i exemplet anger autentiseringsuppgifterna för bindningskonfiguration och beteende för att matcha serverns konfiguration av metadataslutpunkten.
För att Svcutil.exe ska kunna hämta konfigurationen i Svcutil.exe.configmåste Svcutil.exe finnas i samma katalog som konfigurationsfilen. Därför måste du kopiera Svcutil.exe från dess installationsplats till katalogen som innehåller Svcutil.exe.config-filen. Kör sedan följande kommando från katalogen:
.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex
Den inledande ".\" ser till att kopian av Svcutil.exe i den här katalogen (den som har motsvarande Svcutil.exe.config) körs.
MetadataResolver-klient
Om klienten känner till kontraktet och hur man kommunicerar med metadata vid designtillfället kan klienten dynamiskt ta reda på bindningen och adressen för programslutpunkter med hjälp MetadataResolver
av . Den här exempelklienten illustrerar detta genom att visa hur du konfigurerar bindningen och autentiseringsuppgifterna som används av MetadataResolver
genom att skapa och konfigurera en MetadataExchangeClient
.
Samma bindnings- och certifikatinformation som visades i Svcutil.exe.config kan anges imperativt på MetadataExchangeClient
:
// Specify the Metadata Exchange binding and its security mode
WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message);
mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
// Create a MetadataExchangeClient for retrieving metadata, and set the // certificate details
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding);
mexClient.SoapCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My,
X509FindType.FindBySubjectName, "client.com");
mexClient.SoapCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate( StoreLocation.CurrentUser, StoreName.TrustedPeople,
X509FindType.FindBySubjectName, "localhost");
Med den mexClient
konfigurerade kan vi räkna upp de kontrakt som vi är intresserade av och använda MetadataResolver
för att hämta en lista över slutpunkter med dessa kontrakt:
// The contract we want to fetch metadata for
Collection<ContractDescription> contracts = new Collection<ContractDescription>();
ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
contracts.Add(contract);
// Find endpoints for that contract
EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
ServiceEndpointCollection endpoints = MetadataResolver.Resolve(contracts, mexAddress, mexClient);
Slutligen kan vi använda informationen från dessa slutpunkter för att initiera bindningen och adressen för en ChannelFactory
som används för att skapa kanaler för att kommunicera med programslutpunkterna.
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(endpoint.Binding, endpoint.Address);
Huvudpunkten för den här exempelklienten är att visa att om du använder MetadataResolver
, och du måste ange anpassade bindningar eller beteenden för metadatautbyteskommunikationen, kan du använda en MetadataExchangeClient
för att ange de anpassade inställningarna.
Så här konfigurerar och skapar du exemplet
Kontrollera att du har utfört One-Time installationsproceduren för Windows Communication Foundation-exempel.
Skapa lösningen genom att följa anvisningarna i Skapa Windows Communication Foundation-exempel.
Så här kör du exemplet på samma dator
Kör Setup.bat från exempelinstallationsmappen. Detta installerar alla certifikat som krävs för att köra exemplet. Observera att Setup.bat använder verktyget FindPrivateKey.exe, som installeras genom att köra setupCertTool.bat från One-Time installationsproceduren för Windows Communication Foundation-exempel.
Kör klientprogrammet från \MetadataResolverClient\bin eller \SvcutilClient\bin. Klientaktiviteten visas i klientkonsolprogrammet.
Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Ta bort certifikaten genom att köra Cleanup.bat när du är klar med exemplet. Andra säkerhetsexempel använder samma certifikat.
Så här kör du exemplet mellan datorer
Kör
setup.bat service
på servern. Att körasetup.bat
medservice
argumentet skapar ett tjänstcertifikat med den fullständigt kvalificerade domännamnet för datorn och exporterar tjänstcertifikatet till en fil med namnet Service.cer.På servern redigerar du Web.config för att återspegla det nya certifikatnamnet. Det vill säga, ändra attributet
findValue
i elementet <serviceCertificate> till datorns fullständigt kvalificerade domännamn.Kopiera Service.cer-filen från tjänstkatalogen till klientkatalogen på klientdatorn.
Kör
setup.bat client
på klienten . När du körsetup.bat
medclient
argumentet skapas ett klientcertifikat med namnet Client.com och klientcertifikatet exporteras till en fil med namnet Client.cer.I den App.config filen
MetadataResolverClient
på klientdatorn ändrar du adressvärdet för mex-slutpunkten så att den matchar tjänstens nya adress. Det gör du genom att ersätta localhost med serverns fullständigt kvalificerade domännamn. Ändra även förekomsten av "localhost" i filen metadataResolverClient.cs till det nya tjänstcertifikatnamnet (serverns fullständigt kvalificerade domännamn). Gör samma sak för App.config i SvcutilClient-projektet.Kopiera Client.cer-filen från klientkatalogen till tjänstkatalogen på servern.
Kör
ImportServiceCert.bat
på klienten . Detta importerar tjänstcertifikatet från filen Service.cer till lagringsplatsen CurrentUser – TrustedPeople.På servern kör du
ImportClientCert.bat
, detta importerar klientcertifikatet från Client.cer-filen till LocalMachine – TrustedPeople-arkivet.På tjänstdatorn skapar du tjänstprojektet i Visual Studio och väljer hjälpsidan i en webbläsare för att kontrollera att det körs.
På klientdatorn kör du MetadataResolverClient eller SvcutilClient från VS.
- Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Att städa upp efter provet
Kör Cleanup.bat i exempelmappen när du har kört exemplet.
Anmärkning
Det här skriptet tar inte bort tjänstcertifikat på en klient när du kör det här exemplet på flera datorer. Om du har kört WCF-exempel (Windows Communication Foundation) som använder certifikat mellan datorer måste du rensa de tjänstcertifikat som har installerats i CurrentUser – TrustedPeople-arkivet. Gör detta genom att använda följande kommando:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
. Till exempel:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.