Meta Veri Mimarisi Genel Bakış
Windows Communication Foundation (WCF), hizmet meta verilerini dışarı aktarma, yayımlama, alma ve içeri aktarma için zengin bir altyapı sağlar. WCF hizmetleri, Svcutil.exe gibi araçların hizmete erişmek için otomatik olarak istemci kodu oluşturabilmesi için hizmetin uç noktalarıyla nasıl etkileşim kurulduğunu açıklamak için meta verileri kullanır.
WCF meta veri altyapısını oluşturan türlerin çoğu ad alanında System.ServiceModel.Description bulunur.
WCF, bir hizmetteki uç noktaları açıklamak için sınıfını ServiceEndpoint kullanır. WcF kullanarak hizmet uç noktaları için meta veriler oluşturabilir veya örnek oluşturmak ServiceEndpoint üzere hizmet meta verilerini içeri aktarabilirsiniz.
WCF, bir hizmetin meta verilerini türün MetadataSet bir örneği olarak temsil eder ve yapısı WS-MetadataExchange içinde tanımlanan meta veri serileştirme biçimine kesin olarak bağlıdır. Türü MetadataSet , Web Hizmetleri Açıklama Dili (WSDL) belgeleri, XML şema belgeleri veya WS-policy ifadeleri gibi gerçek hizmet meta verilerini bir örnek koleksiyonu MetadataSection olarak paketler. Her System.ServiceModel.Description.MetadataSection örnek belirli bir meta veri diyalekt ve tanımlayıcı içerir. A System.ServiceModel.Description.MetadataSection , özelliğinde MetadataSection.Metadata aşağıdaki öğeleri içerebilir:
Ham meta veriler.
Bir MetadataReference örnek.
Bir MetadataLocation örnek.
Örnekler System.ServiceModel.Description.MetadataReference başka bir meta veri değişimi (MEX) uç noktasına, örnekler ise System.ServiceModel.Description.MetadataLocation HTTP URL'si kullanan bir meta veri belgesine işaret eder. WCF, bir hizmet tarafından uygulanan hizmet uç noktalarını, hizmet sözleşmelerini, bağlamaları, ileti değişim düzenlerini, iletileri ve hata iletilerini açıklamak için WSDL belgelerinin kullanılmasını destekler. Hizmet tarafından kullanılan veri türleri, XML şeması kullanılarak WSDL belgelerinde açıklanmıştır. Daha fazla bilgi için bkz . Şema İçeri ve Dışarı Aktarma. Hizmet davranışı, sözleşme davranışları ve bir hizmetin işlevselliğini genişleten bağlama öğeleri için WSDL uzantılarını dışarı ve içeri aktarmak için WCF kullanabilirsiniz. Daha fazla bilgi için bkz . WCF Uzantısı için Özel Meta Verileri Dışarı Aktarma.
Hizmet Meta Verilerini Dışarı Aktarma
WCF'de meta veri dışarı aktarma, hizmet uç noktalarını açıklama ve istemcilerin hizmetin nasıl kullanılacağını anlamak için kullanabileceği paralel, standartlaştırılmış bir gösterime yansıtma işlemidir. Örneklerden ServiceEndpoint meta verileri dışarı aktarmak için soyut sınıfın MetadataExporter bir uygulamasını kullanın. Bir System.ServiceModel.Description.MetadataExporter uygulama, bir MetadataSet örnekte kapsüllenmiş meta veriler oluşturur.
sınıfı, System.ServiceModel.Description.MetadataExporter bir uç nokta bağlamasının ve ilişkili işlemlerinin, iletilerinin ve hatalarının özelliklerini ve gereksinimlerini açıklayan ilke ifadeleri oluşturmaya yönelik bir çerçeve sağlar. Bu ilke ifadeleri bir PolicyConversionContext örnekte yakalanır. Bir System.ServiceModel.Description.MetadataExporter uygulama daha sonra bu ilke ifadelerini oluşturduğu meta veriye ekleyebilir.
, System.ServiceModel.Description.MetadataExporter uygulamanın kullanması için bir ServiceEndpoint nesne oluştururken bağlamasında arabirimini uygulayan IPolicyExportExtension her System.ServiceModel.Channels.BindingElement birine PolicyConversionContextSystem.ServiceModel.Description.MetadataExporter çağrır. Türündeki IPolicyExportExtension özel uygulamalarınızda arabirimini uygulayarak yeni ilke onaylarını BindingElement dışarı aktarabilirsiniz.
türü WsdlExporter , WCF ile birlikte gelen soyut sınıfın System.ServiceModel.Description.MetadataExporter uygulamasıdır. Türü, WsdlExporter ekli ilke ifadeleriyle WSDL meta verileri oluşturur.
Hizmet uç noktasındaki uç nokta davranışları, sözleşme davranışları veya bağlama öğeleri için özel WSDL meta verilerini veya WSDL uzantılarını dışarı aktarmak için arabirimini uygulayabilirsiniz IWsdlExportExtension . , WsdlExporter WSDL belgesini oluştururken arabirimi uygulayan IWsdlExportExtension bağlama öğeleri, işlem davranışları, sözleşme davranışları ve uç nokta davranışları için bir ServiceEndpoint örneğe bakar.
Yayımlama Hizmeti Meta Verileri
WCF hizmetleri, bir veya daha fazla meta veri uç noktasını göstererek meta verileri yayımlar. Hizmet meta verilerini yayımlamak, hizmet meta verilerini MEX ve HTTP/GET istekleri gibi standartlaştırılmış protokoller kullanarak kullanılabilir hale getirir. Meta veri uç noktaları, adresleri, bağlamaları ve sözleşmeleri olan diğer hizmet uç noktalarına benzer. Yapılandırmada veya kodda bir hizmet konağına meta veri uç noktaları ekleyebilirsiniz.
WCF hizmetinin meta veri uç noktalarını yayımlamak için önce hizmete hizmet davranışının ServiceMetadataBehavior bir örneğini eklemeniz gerekir. Hizmetinize örnek System.ServiceModel.Description.ServiceMetadataBehavior eklemek, hizmetinizi bir veya daha fazla meta veri uç noktasını açığa çıkartarak meta veri yayımlama olanağı sağlar. Hizmet davranışını ekledikten System.ServiceModel.Description.ServiceMetadataBehavior sonra, MEX protokolunu destekleyen meta veri uç noktalarını veya HTTP/GET isteklerine yanıt veren meta veri uç noktalarını kullanıma sunun.
MEX protokolünü kullanan meta veri uç noktalarını eklemek için, hizmet konağınıza IMetadataExchange.WCF adlı hizmet sözleşmesini kullanan hizmet uç noktaları ekleyin, bu hizmet sözleşmesi adına sahip arabirimi tanımlar IMetadataExchange . WS-MetadataExchange uç noktaları veya MEX uç noktaları, Svcutil.exe gibi WCF araçları tarafından kullanılan varsayılan bağlamalarla eşleşecek şekilde sınıftaki statik fabrika yöntemleri MetadataExchangeBindings tarafından kullanıma sunulan dört varsayılan bağlamadan birini kullanabilir. Özel bağlama kullanarak MEX meta veri uç noktalarını da yapılandırabilirsiniz.
hizmetinizdeki ServiceMetadataBehavior tüm hizmet uç noktalarının meta verilerini dışarı aktarmak için bir System.ServiceModel.Description.WsdlExporter kullanır. Bir hizmetten meta verileri dışarı aktarma hakkında daha fazla bilgi için bkz . Meta Verileri Dışarı ve İçeri Aktarma.
, ServiceMetadataBehavior hizmet konağınıza uzantı olarak bir ServiceMetadataExtension örnek ekleyerek hizmet konağınızı genişleter. , System.ServiceModel.Description.ServiceMetadataExtension meta veri yayımlama protokolleri için uygulamayı sağlar. özelliğine System.ServiceModel.Description.ServiceMetadataExtension erişerek Metadata hizmetin meta verilerini çalışma zamanında almak için de kullanabilirsiniz.
Dikkat
Uygulama yapılandırma dosyanıza bir MEX uç noktası ekler ve ardından kodda hizmet konağınıza eklemeyi ServiceMetadataBehavior denerseniz aşağıdaki özel durumu alırsınız:
System.InvalidOperationException: 'IMetadataExchange' sözleşme adı Service1 hizmeti tarafından uygulanan sözleşmeler listesinde bulunamadı. Bu sözleşmeye yönelik desteği etkinleştirmek için yapılandırma dosyasına veya ServiceHost'a doğrudan bir ServiceMetadataBehavior ekleyin.
yapılandırma dosyasına ekleyerek ServiceMetadataBehavior veya hem uç noktayı ServiceMetadataBehavior hem de kodu ekleyerek bu soruna geçici bir çözüm bulabilirsiniz.
Uygulama yapılandırma dosyasına ekleme ServiceMetadataBehavior örneği için bkz . Başlarken. Kod ekleme ServiceMetadataBehavior örneği için bkz . Kendi Kendine Konak örneği.
Dikkat
Her birinin aynı ada sahip bir işlem içerdiği iki farklı hizmet sözleşmesini kullanıma sunan bir hizmet için meta veriler yayımlanırken bir özel durum oluşturulur. Örneğin, Get(Car c) işlemine sahip ICarService adlı bir hizmet sözleşmesini kullanıma sunan bir hizmetiniz varsa ve aynı hizmet Get(Book b) işlemine sahip IBookService adlı bir hizmet sözleşmesini kullanıma sunarsa, hizmetin meta verileri oluşturulurken bir özel durum oluşturulur veya hata iletisi görüntülenir. Bu sorunu geçici olarak çözmek için aşağıdakilerden birini yapın:
Hizmet Meta Verilerini Alma
WCF, WS-MetadataExchange ve HTTP gibi standartlaştırılmış protokolleri kullanarak hizmet meta verilerini alabilir. Bu protokollerin her ikisi de türü tarafından MetadataExchangeClient desteklenir. Bir adres ve isteğe bağlı bağlama sağlayarak hizmet meta verilerini türünü kullanarak System.ServiceModel.Description.MetadataExchangeClient alırsınız. Bir System.ServiceModel.Description.MetadataExchangeClient örnek tarafından kullanılan bağlama statik sınıftan gelen varsayılan bağlamalardan MetadataExchangeBindings biri, kullanıcı tarafından sağlanan bir bağlama veya sözleşme için IMetadataExchange
bir uç nokta yapılandırmasından yüklenen bağlama olabilir. , System.ServiceModel.Description.MetadataExchangeClient türünü kullanarak HttpWebRequest meta veriye HTTP URL başvurularını da çözümleyebilir.
Varsayılan olarak, bir System.ServiceModel.Description.MetadataExchangeClient örnek tek ChannelFactoryBase bir örneğe bağlıdır. sanal yöntemini geçersiz kılarak GetChannelFactory tarafından System.ServiceModel.Description.MetadataExchangeClient kullanılan örneği değiştirebilir veya değiştirebilirsinizChannelFactoryBase. Benzer şekilde, sanal yöntemi geçersiz kılarak MetadataExchangeClient.GetWebRequest HTTP/GET istekleri oluşturmak için tarafından System.ServiceModel.Description.MetadataExchangeClient kullanılan örneği değiştirebilir veya değiştirebilirsinizSystem.Net.HttpWebRequest.
Svcutil.exe aracını kullanarak ve /target:metadata anahtarını ve bir adresi geçirerek WS-MetadataExchange veya HTTP/GET isteklerini kullanarak hizmet meta verilerini alabilirsiniz. Svcutil.exe belirtilen adreste meta verileri indirir ve dosyaları diske kaydeder. Svcutil.exe bir System.ServiceModel.Description.MetadataExchangeClient örneği dahili olarak kullanır ve varsa, adı Svcutil.exe geçirilen adresin düzeniyle eşleşen bir MEX uç nokta yapılandırması (uygulama yapılandırma dosyasından) yükler. Aksi takdirde, Svcutil.exe varsayılan olarak statik fabrika türü tarafından MetadataExchangeBindings tanımlanan bağlamalardan birini kullanır.
Hizmet Meta Verilerini İçeri Aktarma
WCF'de meta veri içeri aktarma işlemi, meta verilerinden bir hizmetin veya bileşen parçalarının soyut bir gösterimini oluşturma işlemidir. Örneğin, WCF bir hizmet için WSDL belgesinden örnekleri, Binding örnekleri veya ContractDescription örnekleri içeri aktarabilirServiceEndpoint. WCF'de hizmet meta verilerini içeri aktarmak için soyut sınıfın MetadataImporter bir uygulamasını kullanın. sınıfından System.ServiceModel.Description.MetadataImporter türetilen türler, WCF'deki WS-policy içeri aktarma mantığından yararlanan meta veri biçimlerini içeri aktarma desteği uygular.
Bir System.ServiceModel.Description.MetadataImporter uygulama, bir PolicyConversionContext nesnedeki hizmet meta verilerine eklenen ilke ifadelerini toplar. ardındanSystem.ServiceModel.Description.MetadataImporter, özelliğindeki arabirimin PolicyImportExtensions uygulamalarını çağırarak meta verileri içeri aktarma işleminin IPolicyImportExtension bir parçası olarak ilkeleri işler.
Bir örnekteki koleksiyona System.ServiceModel.Description.MetadataImporterSystem.ServiceModel.Description.MetadataImporter kendi arabirimi uygulamanızı IPolicyImportExtension ekleyerek yeni ilke onaylarını uygulamasına PolicyImportExtensions içeri aktarma desteği ekleyebilirsiniz. Alternatif olarak, ilke içeri aktarma uzantınızı istemci uygulaması yapılandırma dosyanıza kaydedebilirsiniz.
türü System.ServiceModel.Description.WsdlImporter , WCF ile birlikte gelen soyut sınıfın System.ServiceModel.Description.MetadataImporter uygulamasıdır. türü, System.ServiceModel.Description.WsdlImporter bir MetadataSet nesnede paketlenmiş ekli ilkelerle WSDL meta verilerini içeri aktarır.
Arabirimi uygulayarak IWsdlImportExtension ve ardından uygulamanızı örneğinizdeki System.ServiceModel.Description.WsdlImporter özelliğine WsdlImportExtensions ekleyerek WSDL uzantılarını içeri aktarma desteği ekleyebilirsiniz. , System.ServiceModel.Description.WsdlImporter istemci uygulama yapılandırma dosyanıza kayıtlı arabirimin System.ServiceModel.Description.IWsdlImportExtension uygulamalarını da yükleyebilir.
Dinamik Bağlamalar
Uç nokta bağlamasının değişmesi veya aynı sözleşmeyi kullanan ancak farklı bir bağlamaya sahip bir uç noktaya kanal oluşturmak istemeniz durumunda hizmet uç noktasına kanal oluşturmak için kullandığınız bağlamayı dinamik olarak güncelleştirebilirsiniz. Statik sınıfını MetadataResolver kullanarak belirli bir sözleşmeyi uygulayan hizmet uç noktalarının çalışma zamanında meta verileri alabilir ve içeri aktarabilirsiniz. Ardından, istenen uç noktaya bir istemci veya kanal fabrikası oluşturmak için içeri aktarılan System.ServiceModel.Description.ServiceEndpoint nesneleri kullanabilirsiniz.