Nasıl yapılır: MEX Olmayan Bağlama Üzerinden Meta Verileri Alma
Bu konu başlığında, MEX olmayan bir bağlama üzerinden MEX uç noktasından meta verilerin nasıl alındığı açıklanmaktadır. Bu örnekteki kod, Özel Güvenli Meta Veri Uç Noktası örneğini temel alır.
MEX olmayan bir bağlama üzerinden meta verileri almak için
MEX uç noktası tarafından kullanılan bağlamayı belirleyin. Windows Communication Foundation (WCF) hizmetleri için hizmetin yapılandırma dosyasına erişerek MEX bağlamasını belirleyebilirsiniz. Bu durumda, MEX bağlaması aşağıdaki hizmet yapılandırmasında tanımlanır.
<services> <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior"> <!-- Use the base address provided by the 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>
İstemci yapılandırma dosyasında aynı özel bağlamayı yapılandırın. Burada istemci, MEX uç noktasından meta veri isteğinde bulunurken hizmette kimlik doğrulaması yapmak için kullanılacak bir sertifika sağlamaya yönelik bir
clientCredentials
davranış da tanımlar. Özel bağlama üzerinden meta veri istemek için Svcutil.exe kullanırken, MEX uç nokta yapılandırmasını Svcutil.exe yapılandırma dosyasına eklemeniz gerekir (Svcutil.exe.config) ve uç nokta yapılandırmasının adı aşağıdaki kodda gösterildiği gibi MEX uç noktasının adresinin URI düzeniyle eşleşmelidir.<system.serviceModel> <client> <endpoint name="http" binding="wsHttpBinding" bindingConfiguration="Binding1" behaviorConfiguration="ClientCertificateBehavior" contract="IMetadataExchange" /> </client> <bindings> <wsHttpBinding> <binding name="Binding1"> <security mode="Message"> <message clientCredentialType="Certificate"/> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <endpointBehaviors> <behavior name="ClientCertificateBehavior"> <clientCredentials> <clientCertificate findValue="client.com" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" /> <serviceCertificate> <authentication certificateValidationMode="PeerOrChainTrust" /> </serviceCertificate> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel>
bir
MetadataExchangeClient
ve çağrısıGetMetadata
oluşturun. Bunu yapmanın iki yolu vardır: yapılandırmada özel bağlamayı belirtebilir veya aşağıdaki örnekte gösterildiği gibi kodda özel bağlamayı belirtebilirsiniz.// The custom binding is specified in configuration. EndpointAddress mexAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/Service/mex"); MetadataExchangeClient mexClient = new MetadataExchangeClient("http"); mexClient.ResolveMetadataReferences = true; MetadataSet mexSet = mexClient.GetMetadata(mexAddress); // The custom binding is specified in code. // Specify the Metadata Exchange binding and its security mode. WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message); mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; // Create a MetadataExchangeClient 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"); MetadataExchangeClient mexClient2 = new MetadataExchangeClient(customBinding); mexClient2.ResolveMetadataReferences = true; MetadataSet mexSet2 = mexClient2.GetMetadata(mexAddress);
Aşağıdaki kodda gösterildiği gibi bir
WsdlImporter
ve çağrısıImportAllEndpoints
oluşturun.WsdlImporter importer = new WsdlImporter(mexSet); ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();
Bu noktada, bir hizmet uç noktaları koleksiyonunuz vardır. Meta verileri içeri aktarma hakkında daha fazla bilgi için bkz . Nasıl yapılır: Meta Verileri Hizmet Uç Noktalarına aktarma.