Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Veri sözleşmesi vekili , Veri Sözleşmesi modeli üzerine oluşturulmuş gelişmiş bir özelliktir. Bu özellik, kullanıcıların bir türün seri hale getirilme, seri durumdan çıkarma veya meta veriye yansıtılma şeklini değiştirmek istediği durumlarda tür özelleştirme ve değiştirme için kullanılacak şekilde tasarlanmıştır. Bir vekilin kullanılabileceği bazı senaryolar şunlardır: tür için bir veri sözleşmesi belirtilmediğinde, alanlar ve özellikler DataMemberAttribute özniteliğiyle işaretlenmediğinde veya kullanıcılar dinamik olarak şema varyasyonları oluşturmak istediğinde.
.NET Framework'ten XML gibi uygun bir biçime dönüştürmek için DataContractSerializer kullanılırken, serileştirme ve seri durumdan çıkarma işlemleri veri sözleşmesi vekiliyle gerçekleştirilir. Veri sözleşmesi vekili, XML Şema Belgeleri (XSD) gibi meta veri gösterimleri oluştururken türler için dışarı aktarılan meta verileri değiştirmek için de kullanılabilir. İçeri aktarıldıktan sonra, meta verilerden kod oluşturulur ve bu durumda oluşturulan kodu özelleştirmek için vekil de kullanılabilir.
Vekil Nasıl Çalışır?
Vekil, bir türü ("özgün" tür) başka bir türe ("yedekli" tür) eşleyerek çalışır. Aşağıdaki örnekte özgün tür Inventory ve yeni bir vekil InventorySurrogated tür gösterilmektedir. Türü Inventory serileştirilebilir değil, ancak InventorySurrogated türü:
public class Inventory
{
public int pencils;
public int pens;
public int paper;
}
Bu sınıf için bir veri sözleşmesi tanımlanmadığından, sınıfı bir veri sözleşmesi ile vekil sınıfa dönüştürün. Yedekli sınıf aşağıdaki örnekte gösterilmiştir:
[DataContract(Name = "Inventory")]
public class InventorySurrogated
{
[DataMember]
public int numpencils;
[DataMember]
public int numpaper;
[DataMember]
private int numpens;
public int pens
{
get { return numpens; }
set { numpens = value; }
}
}
IDataContractSurrogate'ı Uygulamak
Veri sözleşmesi vekilini kullanmak için IDataContractSurrogate arabirimini uygulayın.
Aşağıda, olası bir uygulama ile her bir yönteminin IDataContractSurrogate genel bir bakışı sunulmaktadır.
Veri Sözleşmesi Türünü Al
GetDataContractType yöntemi bir türü başka bir türle eşler. Serileştirme, deserileştirme, ithalat ve ihracat için bu yöntem gereklidir.
İlk görev, hangi türlerin diğer türlere eşleneceklerini tanımlamaktır. Örneğin:
public Type GetDataContractType(Type type)
{
Console.WriteLine("GetDataContractType");
if (typeof(Inventory).IsAssignableFrom(type))
{
return typeof(InventorySurrogated);
}
return type;
}
Serileştirme sırasında, bu yöntem tarafından döndürülen eşleme, GetObjectToSerialize yöntemi çağrılarak özgün örneği yedekli bir örneğe dönüştürmek için kullanılır.
Seri durumdan çıkarmada, bu yöntem tarafından döndürülen eşleme, seri hale getirici tarafından vekil türün bir örneğine seri durumdan çıkarmak için kullanılır. Ardından yedeklenen örneği özgün türün bir örneğine dönüştürmek için çağırır GetDeserializedObject .
Dışa aktarımda, bu yöntem tarafından döndürülen vekil türüne yansıma işlemi uygulanarak, meta veri oluşturmak için kullanılacak veri sözleşmesi elde edilir.
İçeri aktarma işleminde, ilk tür, veri sözleşmesinin desteğe başvurma gibi amaçlarla kullanılmasını sağlamak için yansıtılan bir vekil türe değiştirilir.
Type parametresi seri hale getirilen, seri durumdan çıkarılan, içeri veya dışarı aktarılan nesnenin türüdür. GetDataContractType Yöntem, vekiletçi türü işlemezse giriş türünü döndürmelidir. Aksi takdirde uygun yedekli türü döndürebilirsiniz. Birkaç vekil tür varsa, bu yöntemde çok sayıda eşleme tanımlanabilir.
GetDataContractType yöntemi, Int32 veya String gibi yerleşik veri sözleşmesi primitifleri için çağrılmaz. Diziler, kullanıcı tanımlı türler ve diğer veri yapıları gibi diğer türler için bu yöntem her tür için çağrılır.
Önceki örnekte yöntemi, parametresinin type ve Inventory karşılaştırılabilir olup olmadığını denetler. Bu durumda, yöntem onu InventorySurrogated ile eşler. Serileştirme, seri durumdan çıkarma, şemayı içeri aktarma veya dışarı aktarma şeması çağrıldığında, türler arasındaki eşlemeyi belirlemek için önce bu işlev çağrılır.
GetObjectToSerialize Yöntemi
yöntemi, GetObjectToSerialize özgün tür örneğini yedekli tür örneğine dönüştürür. yöntemi serileştirme için gereklidir.
Sonraki adım, GetObjectToSerialize yöntemini uygulayarak fiziksel verilerin özgün örnekten vekile nasıl eşleneceğini tanımlamaktır. Örneğin:
public object GetObjectToSerialize(object obj, Type targetType)
{
Console.WriteLine("GetObjectToSerialize");
if (obj is Inventory)
{
InventorySurrogated isur = new InventorySurrogated();
isur.numpaper = ((Inventory)obj).paper;
isur.numpencils = ((Inventory)obj).pencils;
isur.pens = ((Inventory)obj).pens;
return isur;
}
return obj;
}
GetObjectToSerialize Bir nesne seri hale getirildiğinde yöntemi çağrılır. Bu yöntem, özgün türdeki verileri yedekli türün alanlarına aktarır. Alanlar doğrudan vekil alanlara eşlenebilir veya özgün verilerin işlenmiş halleri vekil alanda depolanabilir. Bazı olası kullanımlar şunlardır: alanları doğrudan eşleme, yedekli alanlarda depolanacak veriler üzerinde işlemler gerçekleştirme veya yedekli alanda özgün türün XML'sini depolama.
targetType parametresi, üyenin bildirilen türüne başvurur. Bu parametre, GetDataContractType yöntemi tarafından döndürülen vekil türdür. Seri hale getirici, döndürülen nesnenin bu türe atanabilir olmasını zorlamaz.
obj parametresi serileştirilecek nesnedir ve gerekirse vekiline dönüştürülür. Eğer vekil nesne, nesneyi işlemezse, bu yöntem giriş nesnesini döndürmelidir. Aksi takdirde, yeni vekil nesne döndürülür. Nesne null ise vekil çağrılmaz. Bu yöntem içinde farklı örnekler için çok sayıda vekil eşleme tanımlanabilir.
Bir DataContractSerializer oluştururken, nesne başvurularını korumasını sağlayabilirsiniz. (Daha fazla bilgi için bkz. Serileştirme ve Seri Durumdan Çıkarma.) Bu, oluşturucusunda preserveObjectReferences parametresi olarak true ayarlanarak yapılır. Bu durumda, izleyen tüm serileştirmeler yalnızca başvuruyu akışa yazdığından, vekil her bir nesne için yalnızca bir kez çağrılır.
preserveObjectReferences
false olarak ayarlandığında, bir örnekle her karşılaşıldığında vekil çağrılır.
Seri hale getirilen örneğin türü bildirilen türden farklıysa, diğer uçta örneğin seri durumdan geri yüklenmesine izin vermek amacıyla, tür bilgileri akışa, örneğin xsi:type şeklinde, yazılır. Bu işlem, nesne yedeklenmiş olsun ya da olmasın gerçekleşir.
Yukarıdaki örnek, örneğin Inventoryverilerini InventorySurrogated değerine dönüştürür. Nesnenin türünü denetler ve yedekli türe dönüştürmek için gerekli işlemeleri gerçekleştirir. Bu durumda, Inventory sınıfının alanları doğrudan InventorySurrogated sınıfı alanlarına kopyalanır.
GetDeserializedObject Yöntemi
GetDeserializedObject yöntemi yedekli tür örneğini özgün tür örneğine dönüştürür. Deserileştirme için gereklidir.
Bir sonraki görev, fiziksel verilerin vekil örnekten özgün örneğe nasıl eşleneceklerini tanımlamaktır. Örneğin:
public object GetDeserializedObject(object obj, Type targetType)
{
Console.WriteLine("GetDeserializedObject");
if (obj is InventorySurrogated)
{
Inventory invent = new Inventory();
invent.pens = ((InventorySurrogated)obj).pens;
invent.pencils = ((InventorySurrogated)obj).numpencils;
invent.paper = ((InventorySurrogated)obj).numpaper;
return invent;
}
return obj;
}
Bu yöntem yalnızca bir nesnenin seri durumdan çıkarılması sırasında çağrılır. Yedek türünden özgün türüne geri seri durumdan çıkarma için ters veri eşlemesi sağlar. Yöntemine GetObjectToSerialize benzer şekilde, bazı olası kullanımlar doğrudan alan verilerini değiştirmek, veriler üzerinde işlemler gerçekleştirmek ve XML verilerini depolamak olabilir. Serileştirmeyi tersine çevirirken, veri dönüştürmedeki değişiklikler nedeniyle her zaman özgün veri değerlerini tam olarak elde edemeyebilirsiniz.
targetType parametresi, üyenin bildirilen türüne başvurur. Bu parametre, GetDataContractType yöntemi tarafından döndürülen vekil türdür.
obj parametresi, seri durumdan çıkarılmış nesneye başvurur. Nesne yedekliyse özgün türüne geri dönüştürülebilir. Bu yöntem, vekil nesne işlemezse giriş nesnesini döndürür. Aksi takdirde, seri durumdan çıkarılmış nesne dönüştürme tamamlandıktan sonra döndürülür. Birden fazla vekil tür varsa, her biri için her türü ve onun dönüşümünü belirterek vekilden birincil türe veri dönüştürme sağlayabilirsiniz.
Bir nesne döndürülürken, iç nesne tabloları bu vekil tarafından döndürülen nesneyle güncelleştirilir. Bir örneğe yapılan sonraki başvurular, nesne tablolarından yedeklenen örneği alır.
Önceki örnek, türündeki InventorySurrogated nesneleri ilk türüne Inventorydönüştürür. Bu durumda veriler doğrudan InventorySurrogated içinden Inventory içindeki ilgili alanlarına geri aktarılır. Veri işlemeleri olmadığından, üye alanlarının her biri serileştirmeden önceki değerlerle aynı değerleri içerir.
GetCustomDataToExport Yöntemi
Şema dışa aktarılırken GetCustomDataToExport yöntemi isteğe bağlıdır. Dışarı aktarılan şemaya ek veri veya ipuçları eklemek için kullanılır. Üye düzeyinde veya tür düzeyinde ek veriler eklenebilir. Örneğin:
public object GetCustomDataToExport(System.Reflection.MemberInfo memberInfo, Type dataContractType)
{
Console.WriteLine("GetCustomDataToExport(Member)");
System.Reflection.FieldInfo fieldInfo = (System.Reflection.FieldInfo)memberInfo;
if (fieldInfo.IsPublic)
{
return "public";
}
else
{
return "private";
}
}
Bu yöntem (iki aşırı yükleme ile), üye veya tür düzeyinde meta veriye ek bilgi eklenmesini sağlar. Bir üyenin genel mi yoksa özel mi olduğu hakkında ipuçları ve şemanın dışarı ve içeri aktarılması boyunca korunacak açıklamalar eklemek mümkündür. Bu tür bilgiler bu yöntem olmadan kaybolur. Bu yöntem üyelerin veya türlerin eklenmesine veya silinmesine neden olmaz, bunun yerine bu düzeylerden herhangi birinde şemalara ek veriler ekler.
Yöntem aşırı yüklenmiştir ve ya bir Type (clrtype parametresi) ya da MemberInfo (memberInfo parametresi) alabilir. İkinci parametre her zaman bir Type (dataContractType parametresidir). Bu yöntem, vekil dataContractType türünün her üyesi ve türü için çağrılır.
Bu aşırı yüklemeler ya null ya da serileştirilebilir bir nesne döndürmelidir. Null olmayan bir nesne, ihraç edilen şema içinde ek açıklama olarak serileştirilecektir.
Type Aşırı yükleme için, şemaya dışarı aktarılan her tür, ilk parametrede bu yönteme yedek türle birlikte dataContractType parametresi olarak gönderilir.
MemberInfo Aşırı yükleme için, şemaya dışarı aktarılan her üye, bilgilerini ikinci parametrede yedekli türe sahip parametre olarak memberInfo gönderir.
GetCustomDataToExport Yöntemi (Tür, Tür)
Bu IDataContractSurrogate.GetCustomDataToExport(Type, Type) yöntemi, her tür tanımı için şema dışa aktarma sırasında çağrılır. yöntemi, dışarı aktarırken şema içindeki türlere bilgi ekler. Tanımlanan her tür, şemaya eklenmesi gereken ek veriler olup olmadığını belirlemek için bu yönteme gönderilir.
GetCustomDataToExport Yöntemi (MemberInfo, Tür)
IDataContractSurrogate.GetCustomDataToExport(MemberInfo, Type), dışarı aktarılan türlerdeki her üye için dışarı aktarma sırasında çağrılır. Bu işlev, dışarı aktarma sırasında şemaya dahil edilecek üyeler için açıklamaları özelleştirmenizi sağlar. Sınıfındaki her üyenin bilgileri, şemaya ek veri eklenmesi gerekip gerekmediğini denetlemek için bu yönteme gönderilir.
Yukarıdaki örnek, dataContractType içinde temsilci grubunun her bir üyesini arar. Ardından her alan için uygun erişim değiştiriciyi döndürür. Bu özelleştirme olmadan, erişim değiştiricileri için varsayılan değer geneldir. Bu nedenle, gerçek erişim kısıtlamaları ne olursa olsun, dışarı aktarılan şema kullanılarak oluşturulan kodda tüm üyeler genel olarak tanımlanabilir. Bu uygulamayı kullanmadığınızda, vekilde özel olarak tanımlansa bile dışarı aktarılan şemada üye numpens genel olur. Bu yöntemin kullanılmasıyla, dışarı aktarılan şemada erişim değiştiricisi özel olarak oluşturulabilir.
GetReferencedTypeOnImport Yöntemi
Bu yöntem Type vekili özgün türe eşler. Bu yöntem şema içeri aktarma için isteğe bağlıdır.
Şemayı içeri aktaran ve bunun için kod oluşturan bir vekil oluştururken, sonraki görev bir vekil örneğin türünü özgün türüne tanımlamaktır.
Oluşturulan kodun mevcut bir kullanıcı türüne başvurması gerekiyorsa, bu metot uygulanarak GetReferencedTypeOnImport gerçekleştirilir.
Bir şema içeri aktarılırken, her tür bildirimi için vekil veri sözleşmesini bir türe eşlemek amacıyla bu yöntem çağrılır. Dize parametreleri typeName ve typeNamespace yedekli türün adını ve ad alanını tanımlayın. için dönüş değeri GetReferencedTypeOnImport , yeni bir tür oluşturulması gerekip gerekmediğini belirlemek için kullanılır. Bu yöntem geçerli bir tür veya null döndürmelidir. Geçerli türler için döndürülen tür, oluşturulan kodda başvurulmuş tür olarak kullanılır. Null döndürülürse, hiçbir türe başvurulmayacak ve yeni bir tür oluşturulmalıdır. Birkaç vekil varsa, her vekil tür için eşlemeyi ilk türüne geri gerçekleştirmek mümkündür.
customData parametresi, başlangıçta GetCustomDataToExport öğesinden döndürülen nesnedir. Bu customData , vekil yazarların kod oluşturmak için içeri aktarma sırasında kullanılacak meta verilere ek veri/ipuçları eklemek istediklerinde kullanılır.
ProcessImportedType Yöntemi
ProcessImportedType yöntemi, şema içeri aktarma işleminden oluşturulan herhangi bir türü özelleştirir. Bu yöntem isteğe bağlıdır.
Bir şema içeri aktarılırken, bu yöntem içeri aktarılan tür ve derleme bilgilerinin özelleştirilmesine olanak tanır. Örneğin:
public System.CodeDom.CodeTypeDeclaration ProcessImportedType(System.CodeDom.CodeTypeDeclaration typeDeclaration, System.CodeDom.CodeCompileUnit compileUnit)
{
Console.WriteLine("ProcessImportedType");
foreach (CodeTypeMember member in typeDeclaration.Members)
{
object memberCustomData = member.UserData[typeof(IDataContractSurrogate)];
if (memberCustomData != null
&& memberCustomData is string
&& ((string)memberCustomData == "private"))
{
member.Attributes = ((member.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Private);
}
}
return typeDeclaration;
}
İçeri aktarma sırasında, oluşturulan her tür için bu yöntem çağrılır. Belirtilen CodeTypeDeclaration değerini değiştirin veya değerini CodeCompileUnitdeğiştirin. Bu, adını, üyelerini, özniteliklerini ve diğer birçok özelliğini CodeTypeDeclarationdeğiştirmeyi içerir.
CodeCompileUnit'i işleyerek, yönergeleri, ad alanlarını, referans verilen derlemeleri ve başka birçok unsuru değiştirebilirsiniz.
CodeTypeDeclaration parametresi dom türü bildirimini içerir. parametresi, CodeCompileUnit kodu işlemek için değişiklik yapılmasını sağlar. Sonucun null döndürülmesi, tür bildiriminin atılmasına neden olur. Buna karşılık, bir CodeTypeDeclaration döndürürken değişiklikler korunur.
Meta verileri dışarı aktarma sırasında özel veriler eklenirse, kullanılabilmesi için içeri aktarma sırasında kullanıcıya sağlanması gerekir. Bu özel veriler, programlama modeli ipuçları veya diğer açıklamalar için kullanılabilir. Her CodeTypeDeclaration ve CodeTypeMember örneği, UserData özelliği olarak ve IDataContractSurrogate türüne dönüştürülerek özel verileri içerir.
Yukarıdaki örnek, içeri aktarılan şemada bazı değişiklikler gerçekleştirir. Kod, bir vekil kullanarak özgün türün özel üyelerini korur. Şema içeri aktarılırken varsayılan erişim değiştiricisi şeklindedir public. Bu nedenle, bu örnekte olduğu gibi, vekil şemanın tüm üyeleri değiştirilmediği sürece genel olacaktır. Dışarı aktarma sırasında, hangi üyelerin özel olduğu hakkında özel olarak belirtilmiş veriler meta verilere eklenir. Örnek özel verileri arar, erişim değiştiricinin özel olup olmadığını denetler ve ardından özniteliklerini ayarlayarak uygun üyeyi özel olacak şekilde değiştirir. Bu özelleştirme olmadan, numpens üye özel yerine genel olarak tanımlanırdı.
GetKnownCustomDataTypes Yöntemi
Bu yöntem şemadan tanımlanan özel veri türlerini alır. Bu yöntem şema içe aktarma için isteğe bağlıdır.
yöntemi şema dışarı ve içeri aktarma işleminin başında çağrılır. yöntemi, dışarı veya içeri aktarılan şemada kullanılan özel veri türlerini döndürür. Yönteme, tür koleksiyonu olan bir Collection<T> (bu customDataTypes parametresidir) geçirilir. Bu yöntem, bu koleksiyona ek bilinen türler eklemelidir. Özel verilerin DataContractSerializer kullanılarak serileştirilmesi ve seriden çıkarılması için bilinen özel veri türlerine ihtiyaç vardır. Daha fazla bilgi için bkz. Veri Sözleşmesi Bilinen Türleri.
Vekil Kullanımı
WCF'de veri sözleşmesi vekilini kullanmak için birkaç özel prosedürü izlemeniz gerekir.
Serileştirme ve Deserileştirme için Vekil Kullanma
Verileri vekil ile serileştirme ve ters serileştirme işlemlerini gerçekleştirmek için DataContractSerializer kullanın. DataContractSerializer, DataContractSerializerOperationBehavior tarafından oluşturulur. Vekil de belirtilmelidir.
Serileştirme ve seriden çıkartma süreçlerini gerçekleştirmek için
Hizmetiniz için ServiceHost öğesinin bir örneğini oluşturun. Tam yönergeler için bkz. Temel WCF Programlama.
Belirtilen hizmet ana bilgisayarlarının her ServiceEndpoint için OperationDescription'ini bulun.
bir örneğinin DataContractSerializerOperationBehavior bulunup bulunmadığını belirlemek için işlem davranışlarını arayın.
DataContractSerializerOperationBehavior bulunursa, onun DataContractSurrogate özelliğini vekilin yeni bir örneği olarak ayarlayın. DataContractSerializerOperationBehavior bulunamazsa, yeni bir örnek oluşturun ve yeni davranışın DataContractSurrogate üyesini vekilin yeni bir örneği olarak ayarlayın.
Son olarak, aşağıdaki örnekte gösterildiği gibi bu yeni davranışı geçerli işlem davranışlarına ekleyin:
using (ServiceHost serviceHost = new ServiceHost(typeof(InventoryCheck))) foreach (ServiceEndpoint ep in serviceHost.Description.Endpoints) { foreach (OperationDescription op in ep.Contract.Operations) { DataContractSerializerOperationBehavior dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior; if (dataContractBehavior != null) { dataContractBehavior.DataContractSurrogate = new InventorySurrogated(); } else { dataContractBehavior = new DataContractSerializerOperationBehavior(op); dataContractBehavior.DataContractSurrogate = new InventorySurrogated(); op.Behaviors.Add(dataContractBehavior); } } }
Metadata İçeri Aktarımı için Temsilci Kullanma
İstemci tarafı kodu oluşturmak için WSDL ve XSD gibi meta verileri içeri aktarırken, vekilin XSD şemasından XsdDataContractImporterkod oluşturmaktan sorumlu bileşene eklenmesi gerekir. Bunu yapmak için, meta verilerini içeri aktarmak amacıyla kullanılan WsdlImporter öğesini doğrudan değiştirin.
Meta veri içeri aktarma için vekil uygulama
sınıfını kullanarak meta verileri içeri aktarın WsdlImporter .
Bir TryGetValue öğesinin tanımlanıp tanımlanmadığını denetlemek için XsdDataContractImporter yöntemini kullanın.
TryGetValue yöntemi
falsedöndürürse, yeni bir XsdDataContractImporter oluşturun ve Options özelliğini, ImportOptions sınıfının yeni bir örneğine ayarlayın. Aksi takdirde,outyönteminin TryGetValue parametresi tarafından döndürülen içeri aktarıcıyı kullanın.XsdDataContractImporter tanımlı değilseImportOptions, özelliğini sınıfın yeni bir örneği ImportOptions olarak ayarlayın.
DataContractSurrogate öğesinin ImportOptionsXsdDataContractImporter özelliğini vekilin yeni bir örneğine ayarlayın.
XsdDataContractImporter özelliği tarafından döndürülen koleksiyona State sınıfından devralınan WsdlImporter'yi ekleyin.
ImportAllContracts yöntemini kullanarak şema içindeki tüm veri sözleşmelerini WsdlImporter ile içeri aktarın. Son adım sırasında, vekile çağrılarak yüklenen şemalardan kod oluşturulur.
MetadataExchangeClient mexClient = new MetadataExchangeClient(metadataAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaDocs = mexClient.GetMetadata(); WsdlImporter importer = new WsdlImporter(metaDocs); object dataContractImporter; XsdDataContractImporter xsdInventoryImporter; if (!importer.State.TryGetValue(typeof(XsdDataContractImporter), out dataContractImporter)) xsdInventoryImporter = new XsdDataContractImporter(); xsdInventoryImporter = (XsdDataContractImporter)dataContractImporter; xsdInventoryImporter.Options ??= new ImportOptions(); xsdInventoryImporter.Options.DataContractSurrogate = new InventorySurrogated(); importer.State.Add(typeof(XsdDataContractImporter), xsdInventoryImporter); Collection<ContractDescription> contracts = importer.ImportAllContracts();
Meta Veri İhracatı İçin Vekil Kullanma
Varsayılan olarak, bir hizmet için WCF'den meta verileri dışarı aktarırken hem WSDL hem de XSD şemasının oluşturulması gerekir. Vekilin, veri sözleşmesi türleri için XSD şeması oluşturmakla sorumlu bileşene XsdDataContractExportereklenmesi gerekir. Bunu yapmak için, IWsdlExportExtension uygulayan bir davranış kullanarak WsdlExporter öğesini değiştirin veya meta verileri dışa aktarmak için kullanılan WsdlExporter öğesini doğrudan değiştirin.
Meta veri dışa aktarma işlemi için bir vekil kullanma
Yeni WsdlExporter oluşturun veya
wsdlExporteryöntemine verilen ExportContract parametresini kullanın.TryGetValue işlevini kullanarak bir XsdDataContractExporter'nin tanımlanıp tanımlanmadığını denetleyin.
Eğer TryGetValue
falsedöndürürse, XsdDataContractExporter öğesinden oluşturulan XML şemalarıyla yeni bir WsdlExporter oluşturun ve bunu, State'ın WsdlExporter özelliği tarafından döndürülen koleksiyona ekleyin. Aksi takdirde,outparametresi aracılığıyla döndürülen dışa aktarıcıyı TryGetValue yöntemi kullanın.XsdDataContractExporter tanımlı değilse, ExportOptions özelliğini Options sınıfının yeni bir örneğine ayarlayın.
DataContractSurrogate öğesinin ExportOptionsXsdDataContractExporter özelliğini vekilin yeni bir örneğine ayarlayın. Meta verileri dışarı aktarmak için sonraki adımlar herhangi bir değişiklik gerektirmez.
WsdlExporter exporter = new WsdlExporter(); //or //public void ExportContract(WsdlExporter exporter, // WsdlContractConversionContext context) { ... } object dataContractExporter; XsdDataContractExporter xsdInventoryExporter; if (!exporter.State.TryGetValue(typeof(XsdDataContractExporter), out dataContractExporter)) { xsdInventoryExporter = new XsdDataContractExporter(exporter.GeneratedXmlSchemas); } else { xsdInventoryExporter = (XsdDataContractExporter)dataContractExporter; } exporter.State.Add(typeof(XsdDataContractExporter), xsdInventoryExporter); if (xsdInventoryExporter.Options == null) xsdInventoryExporter.Options = new ExportOptions(); xsdInventoryExporter.Options.DataContractSurrogate = new InventorySurrogated();