Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pengganti kontrak data adalah fitur lanjutan yang dibangun berdasarkan model Kontrak Data. Fitur ini dirancang untuk digunakan untuk kustomisasi jenis dan substitusi dalam situasi di mana pengguna ingin mengubah bagaimana jenis diserialisasikan, dideserialisasi, atau diproyeksikan menjadi metadata. Beberapa skenario di mana pengganti dapat digunakan adalah ketika kontrak data belum ditentukan untuk jenis, bidang dan properti tidak ditandai dengan atribut DataMemberAttribute atau pengguna ingin membuat variasi skema secara dinamis.
Serialisasi dan deserialisasi dicapai dengan pengganti kontrak data saat menggunakan DataContractSerializer untuk mengonversi dari .NET Framework ke format yang sesuai, seperti XML. Pengganti kontrak data juga dapat digunakan untuk memodifikasi metadata yang diekspor untuk jenis, saat menghasilkan representasi metadata seperti Dokumen Skema XML (XSD). Setelah impor, kode dibuat dari metadata dan pengganti juga dapat digunakan dalam hal ini untuk menyesuaikan kode yang dihasilkan.
Cara Kerja Pengganti
Pengganti berfungsi dengan cara memetakan satu jenis (jenis "asli") ke jenis lainnya (jenis "pengganti"). Contoh berikut menunjukkan jenis Inventory asli dan jenis pengganti InventorySurrogated baru. Jenisnya Inventory tidak dapat diserialisasikan tetapi jenisnya InventorySurrogated adalah:
public class Inventory
{
public int pencils;
public int pens;
public int paper;
}
Karena kontrak data belum ditentukan untuk kelas ini, konversi kelas ke kelas pengganti dengan kontrak data. Kelas pengganti ditampilkan dalam contoh berikut:
[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; }
}
}
Menerapkan IDataContractSurrogate
Untuk menggunakan pengganti kontrak data, terapkan IDataContractSurrogate antarmuka.
Berikut ini adalah gambaran umum setiap metode IDataContractSurrogate dengan kemungkinan implementasi.
GetDataContractType
Metode GetDataContractType mengubah satu jenis ke jenis lainnya. Metode ini diperlukan untuk serialisasi, deserialisasi, impor, dan ekspor.
Tugas pertama adalah menentukan jenis apa yang akan dipetakan ke jenis lain. Contohnya:
public Type GetDataContractType(Type type)
{
Console.WriteLine("GetDataContractType");
if (typeof(Inventory).IsAssignableFrom(type))
{
return typeof(InventorySurrogated);
}
return type;
}
Pada serialisasi, pemetaan yang dikembalikan oleh metode ini kemudian digunakan untuk mengubah instans asli menjadi instans pengganti dengan memanggil GetObjectToSerialize metode .
Pada deserialisasi, pemetaan yang dikembalikan oleh metode ini digunakan oleh serializer untuk mendeserialisasi menjadi instance dari tipe pengganti. Ini kemudian memanggil GetDeserializedObject untuk mengubah instans pengganti menjadi instans jenis asli.
Pada saat ekspor, jenis pengganti yang dikembalikan oleh metode ini dipantulkan untuk mendapatkan kontrak data yang digunakan untuk menghasilkan metadata.
Saat diimpor, jenis awal diubah menjadi jenis pengganti yang dicerminkan untuk mendapatkan kontrak data yang digunakan untuk tujuan seperti mendukung referensi.
Parameter Type adalah jenis objek yang sedang diserialisasikan, dideserialisasi, diimpor, atau diekspor. Metode GetDataContractType harus mengembalikan tipe input jika pengganti tidak menangani tipe. Jika tidak, kembalikan tipe pengganti yang sesuai. Jika ada beberapa jenis pengganti, banyak pemetaan dapat didefinisikan dalam metode ini.
Metode GetDataContractType ini tidak dipanggil untuk primitif kontrak data bawaan, seperti Int32 atau String. Untuk jenis lain, seperti array, jenis yang ditentukan pengguna, dan struktur data lainnya, metode ini akan dipanggil untuk setiap jenis.
Dalam contoh sebelumnya, metode memeriksa apakah type parameter dan Inventory sebanding. Jika demikian, metode menghubungkannya ke InventorySurrogated. Setiap kali serialisasi, deserialisasi, skema impor, atau skema ekspor dipanggil, fungsi ini dipanggil terlebih dahulu untuk menentukan pemetaan antara jenis.
Metode GetObjectToSerialize (untuk serialisasi objek)
Metode ini GetObjectToSerialize mengonversi instans jenis asli ke instans jenis pengganti. Metode ini diperlukan untuk serialisasi.
Langkah selanjutnya adalah menentukan cara data fisik akan dipetakan dari instans asli ke pengganti dengan menerapkan GetObjectToSerialize metode . Contohnya:
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;
}
Metode GetObjectToSerialize ini dipanggil ketika objek diserialisasikan. Metode ini mentransfer data dari jenis asli ke bidang jenis pengganti. Bidang dapat langsung dipetakan ke bidang pengganti, atau hasil manipulasi dari data asli dapat disimpan di bidang pengganti. Beberapa kemungkinan penggunaan meliputi: langsung memetakan bidang, melakukan operasi pada data yang akan disimpan di bidang pengganti, atau menyimpan XML dari jenis asli di bidang pengganti.
Parameter targetType mengacu pada jenis anggota yang dideklarasikan. Parameter ini adalah jenis pengganti yang dikembalikan oleh metode GetDataContractType. Serializer tidak memberlakukan bahwa objek yang dikembalikan dapat ditetapkan ke jenis ini. Parameter obj adalah objek untuk diserialisasikan, dan akan dikonversi ke penggantinya jika perlu. Metode ini harus mengembalikan objek input jika pengganti tidak menangani objek. Jika tidak, objek pengganti baru akan dikembalikan. Pengganti tidak dipanggil jika objek null. Banyak pemetaan pengganti untuk instans yang berbeda dapat didefinisikan dalam metode ini.
Saat membuat DataContractSerializer, Anda dapat menginstruksikannya untuk mempertahankan referensi objek. (Untuk informasi selengkapnya, lihat Serialisasi dan Deserialisasi.) Ini dilakukan dengan mengatur preserveObjectReferences parameter dalam konstruktornya ke true. Dalam kasus tersebut, pengganti hanya dipanggil sekali untuk sebuah objek karena semua serialisasi berikutnya hanya memasukkan referensi ke dalam aliran. Jika preserveObjectReferences diatur ke false, maka pengganti dipanggil setiap kali instans ditemui.
Jika jenis instans yang diserialisasikan berbeda dari jenis yang dideklarasikan, informasi jenis ditulis ke dalam aliran, misalnya, xsi:type untuk memungkinkan instans dideserialisasi di ujung lain. Proses ini terjadi apakah objek dijadikan pengganti atau tidak.
Contoh di atas mengonversi data instans Inventory menjadi data dari InventorySurrogated. Ini memeriksa jenis objek dan melakukan manipulasi yang diperlukan untuk dikonversi ke jenis pengganti. Dalam hal ini, bidang dari kelas Inventory disalin langsung ke bidang dari kelas InventorySurrogated.
Metode GetDeserializedObject
Metode ini GetDeserializedObject mengonversi instans jenis pengganti ke instans jenis asli. Diperlukan untuk deserialisasi.
Tugas berikutnya adalah menentukan cara data fisik akan dipetakan dari instans pengganti ke yang asli. Contohnya:
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;
}
Metode ini hanya dipanggil selama deserialisasi objek. Ini menyediakan pemetaan data balik untuk deserialisasi dari tipe pengganti kembali ke tipe asli. Mirip dengan metode GetObjectToSerialize, beberapa kemungkinan penggunaannya adalah untuk langsung bertukar data lapangan, melakukan operasi pada data, dan menyimpan data XML. Saat mendeserialisasi, Anda mungkin tidak selalu mendapatkan nilai data yang persis seperti dari data asli karena adanya manipulasi dalam konversi data.
Parameter targetType mengacu pada jenis anggota yang dideklarasikan. Parameter ini adalah jenis pengganti yang dikembalikan oleh metode GetDataContractType. Parameter obj mengacu pada objek yang telah dideserialisasi. Objek dapat dikonversi kembali ke jenis aslinya jika diganti. Metode ini mengembalikan objek input jika pengganti tidak menangani objek. Jika tidak, objek yang dideserialisasi akan dikembalikan setelah konversinya selesai. Jika ada beberapa jenis pengganti, Anda dapat memberikan konversi data dari pengganti ke jenis utama untuk masing-masing dengan menunjukkan setiap jenis dan konversinya.
Saat mengembalikan objek, tabel objek internal diperbarui dengan objek yang dikembalikan oleh pengganti ini. Setiap referensi berikutnya ke instans akan mendapatkan instans pengganti dari tabel objek.
Contoh sebelumnya mengonversi objek jenis InventorySurrogated kembali ke jenis Inventoryawal . Dalam hal ini, data langsung ditransfer kembali dari InventorySurrogated ke bidang yang sesuai di Inventory. Karena tidak ada manipulasi data, setiap bidang anggota akan berisi nilai yang sama seperti sebelum serialisasi.
Metode untuk Mengekspor Data Kustom
Saat mengekspor skema, GetCustomDataToExport metode ini bersifat opsional. Ini digunakan untuk menyisipkan data atau petunjuk tambahan ke dalam skema yang diekspor. Data tambahan dapat disisipkan di tingkat anggota atau tingkat jenis. Contohnya:
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";
}
}
Metode ini (dengan dua kelebihan beban) memungkinkan penyertaan informasi tambahan ke dalam metadata baik di tingkat anggota atau jenis. Dimungkinkan untuk menyertakan petunjuk tentang apakah anggota publik atau bersifat privat, serta komentar yang akan dipertahankan selama ekspor dan impor skema. Informasi tersebut akan hilang tanpa metode ini. Metode ini tidak menyebabkan penyisipan atau penghapusan anggota atau jenis, melainkan menambahkan data tambahan ke skema di salah satu tingkat ini.
Metode ini kelebihan beban dan dapat mengambil Type parameter (clrtype ) atau MemberInfo (memberInfo parameter). Parameter kedua selalu merupakan Type (dataContractType parameter). Metode ini dipanggil untuk setiap anggota dan jenis-jenis dataContractType pengganti.
Salah satu kelebihan beban ini harus mengembalikan null atau objek yang dapat diserialisasikan. Objek non-null akan diserialisasikan sebagai anotasi ke dalam skema yang diekspor.
Type Untuk kelebihan beban, setiap jenis yang diekspor ke skema dikirim ke metode ini dalam parameter pertama bersama dengan jenis pengganti sebagai dataContractType parameter.
MemberInfo Untuk kelebihan beban, setiap anggota yang diekspor ke skema mengirimkan informasinya sebagai memberInfo parameter dengan jenis pengganti dalam parameter kedua.
Metode AmbilDataKustomUntukEkspor (Jenis, Jenis)
Metode IDataContractSurrogate.GetCustomDataToExport(Type, Type) ini dipanggil selama ekspor skema untuk setiap definisi jenis. Metode menambahkan informasi pada tipe dalam skema saat mengekspor. Setiap jenis yang ditentukan dikirim ke metode ini untuk menentukan apakah ada data tambahan yang perlu disertakan dalam skema.
Metode GetCustomDataToExport (MemberInfo, Type)
IDataContractSurrogate.GetCustomDataToExport(MemberInfo, Type) dipanggil selama ekspor untuk setiap anggota dari tipe yang diekspor. Fungsi ini memungkinkan Anda menyesuaikan komentar apa pun untuk anggota yang akan disertakan dalam skema saat diekspor. Informasi untuk setiap anggota dalam kelas dikirim ke metode ini untuk memeriksa apakah ada data tambahan yang perlu ditambahkan dalam skema.
Contoh di atas menelusuri dataContractType untuk setiap anggota pengganti. Kemudian mengembalikan pengubah akses yang sesuai untuk setiap bidang. Tanpa kustomisasi ini, nilai default untuk pengubah akses adalah publik. Oleh karena itu, semua anggota akan didefinisikan sebagai publik dalam kode yang dihasilkan menggunakan skema yang diekspor terlepas dari pembatasan akses aktual mereka. Ketika tidak menggunakan implementasi ini, anggota numpens akan menjadi publik dalam skema yang diekspor meskipun didefinisikan dalam pengganti sebagai privat. Melalui penggunaan metode ini, pengubah akses dalam skema yang diekspor dapat dihasilkan sebagai privat.
Metode GetReferencedTypeOnImport
Metode ini memetakan Type dari pengganti ke tipe asli. Metode ini bersifat opsional untuk impor skema.
Saat membuat pengganti yang mengimpor skema dan menghasilkan kode untuk itu, tugas berikutnya adalah menentukan jenis instans pengganti ke jenis aslinya.
Jika kode yang dihasilkan perlu mereferensikan jenis pengguna yang ada, ini dilakukan dengan menerapkan GetReferencedTypeOnImport metode .
Saat mengimpor skema, metode ini dipanggil untuk setiap deklarasi tipe guna memetakan kontrak data yang dijadikan pengganti ke tipe tertentu. Parameter typeName dan typeNamespace menentukan nama dan namespace dari tipe pengganti. Nilai pengembalian untuk GetReferencedTypeOnImport digunakan untuk menentukan apakah jenis baru perlu dibuat. Metode ini harus mengembalikan tipe yang valid atau null. Untuk jenis yang valid, jenis yang dikembalikan akan digunakan sebagai jenis yang direferensikan dalam kode yang dihasilkan. Jika null dikembalikan, tidak ada jenis yang akan direferensikan dan jenis baru harus dibuat. Jika ada beberapa pengganti, dimungkinkan untuk melakukan pemetaan untuk setiap jenis pengganti kembali ke jenis awalnya.
Parameter customData adalah objek yang awalnya dikembalikan dari GetCustomDataToExport. Ini customData digunakan ketika penulis pengganti ingin menyisipkan data/petunjuk tambahan ke dalam metadata untuk digunakan selama impor untuk menghasilkan kode.
Metode ProcessImportedType
Metode ProcessImportedType ini menyesuaikan segala jenis yang dihasilkan dari pengimporan skema. Metode ini bersifat opsional.
Saat mengimpor skema, metode ini memungkinkan jenis dan informasi kompilasi yang diimpor untuk disesuaikan. Contohnya:
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;
}
Selama proses impor, metode ini dipanggil untuk setiap tipe yang dibuat. Ubah yang ditentukan CodeTypeDeclaration atau ubah CodeCompileUnit. Ini termasuk mengubah nama, anggota, atribut, dan banyak properti lainnya dari CodeTypeDeclaration. Dengan memproses CodeCompileUnit, kita dapat mengubah arahan, namespace, rakitan yang direferensikan, dan berbagai aspek lainnya.
Parameter CodeTypeDeclaration berisi deklarasi jenis DOM kode. Parameter CodeCompileUnit memungkinkan modifikasi untuk memproses kode. Mengembalikan null menyebabkan deklarasi tipe dibatalkan. Sebaliknya, saat mengembalikan CodeTypeDeclaration, modifikasi dipertahankan.
Jika data kustom dimasukkan selama ekspor metadata, data tersebut perlu diberikan kepada pengguna selama impor sehingga dapat digunakan. Data kustom ini dapat digunakan untuk petunjuk model pemrograman, atau komentar lainnya. Masing-masing CodeTypeDeclaration dan CodeTypeMember instans menyertakan data kustom sebagai UserData properti, diubah menjadi jenis IDataContractSurrogate.
Contoh di atas melakukan beberapa perubahan pada skema yang diimpor. Kode mempertahankan anggota privat dari tipe asli dengan menggunakan pengganti. Pengubah akses default saat mengimpor skema adalah public. Oleh karena itu, semua anggota skema pengganti akan menjadi publik kecuali dimodifikasi, seperti dalam contoh ini. Selama ekspor, data kustom dimasukkan ke dalam metadata tentang anggota mana yang bersifat privat. Contoh mencari data kustom, memeriksa apakah pengubah akses bersifat privat, lalu memodifikasi anggota yang sesuai menjadi privat dengan mengatur atributnya. Tanpa kustomisasi ini, numpens anggota akan didefinisikan sebagai publik alih-alih privat.
Metode GetKnownCustomDataTypes
Metode ini memperoleh jenis data kustom yang ditentukan dari skema. Metode ini bersifat opsional untuk impor skema.
Metode ini dipanggil pada awal ekspor dan impor skema. Metode mengembalikan jenis data kustom yang digunakan dalam skema yang diekspor atau diimpor. Metode ini menerima parameter Collection<T> (customDataTypes), yang merupakan kumpulan tipe. Metode harus menambahkan jenis tambahan yang diketahui ke koleksi ini. Jenis data kustom yang diketahui diperlukan untuk mengaktifkan serialisasi dan deserialisasi data kustom menggunakan DataContractSerializer. Untuk informasi selengkapnya, lihat Jenis Kontrak Data yang Diketahui.
Menerapkan Pengganti
Untuk menggunakan pengganti kontrak data dalam WCF, Anda harus mengikuti beberapa prosedur khusus.
Untuk Menggunakan Pengganti untuk Serialisasi dan Deserialisasi
Gunakan DataContractSerializer untuk melakukan serialisasi dan deserialisasi data dengan penyangga. DataContractSerializer dibuat oleh DataContractSerializerOperationBehavior. Pengganti juga harus ditentukan.
Untuk menerapkan serialisasi dan deserialisasi
Buat instans ServiceHost untuk layanan Anda. Untuk instruksi lengkapnya, lihat Pemrograman WCF Dasar.
Untuk setiap ServiceEndpoint host layanan yang ditentukan, cari OperationDescription.
Telusuri perilaku operasi untuk melihat apakah instans DataContractSerializerOperationBehavior ditemukan.
Jika DataContractSerializerOperationBehavior ditemukan, atur propertinya DataContractSurrogate ke instans baru dari pengganti. Jika tidak ada DataContractSerializerOperationBehavior yang ditemukan, maka buatlah instans baru dan atur anggota DataContractSurrogate dari perilaku baru ke instans baru dari pengganti.
Terakhir, tambahkan perilaku baru ini ke perilaku operasi saat ini, seperti yang ditunjukkan dalam contoh berikut:
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); } } }
Untuk Menggunakan Pengganti untuk Impor Metadata
Saat mengimpor metadata seperti WSDL dan XSD untuk menghasilkan kode sisi klien, surrogate perlu ditambahkan ke komponen yang bertanggung jawab untuk menghasilkan kode dari skema XSD, XsdDataContractImporter. Untuk melakukan ini, secara langsung ubah WsdlImporter yang digunakan untuk mengimpor metadata.
Untuk menerapkan solusi pengganti untuk impor metadata
Impor metadata menggunakan WsdlImporter kelas .
Gunakan metode TryGetValue untuk memeriksa apakah XsdDataContractImporter telah ditentukan.
Jika metode TryGetValue mengembalikan
false, buat XsdDataContractImporter baru dan atur properti Options ke instance baru dari kelas ImportOptions. Jika tidak, gunakan importir yang dikembalikan oleh parameteroutdari metode TryGetValue.Jika XsdDataContractImporter belum ditentukan, maka atur properti menjadi instance baru dari kelas ImportOptions.
Atur properti DataContractSurrogate dari ImportOptions dari XsdDataContractImporter menjadi instans baru pengganti.
Tambahkan XsdDataContractImporter ke dalam koleksi yang dikembalikan oleh properti State milik WsdlImporter (diwarisi dari kelas MetadataExporter.)
ImportAllContracts Gunakan metode WsdlImporter untuk mengimpor semua kontrak data dalam skema. Selama langkah terakhir, kode dihasilkan dari skema yang dimuat dengan melalui pemanggilan pada surrogate.
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();
Untuk Menggunakan pengganti untuk Ekspor Metadata
Secara default, saat mengekspor metadata dari WCF untuk layanan, skema WSDL dan XSD perlu dihasilkan. Pengganti perlu ditambahkan ke komponen yang bertanggung jawab untuk menghasilkan skema XSD untuk jenis kontrak data, XsdDataContractExporter. Untuk melakukan ini, gunakan perilaku yang menerapkan IWsdlExportExtension untuk memodifikasi WsdlExporter, atau langsung memodifikasi WsdlExporter yang digunakan untuk mengekspor metadata.
Menggunakan pengganti untuk ekspor metadata
Buat WsdlExporter baru atau gunakan parameter
wsdlExporteryang diteruskan ke metode ExportContract.Gunakan fungsi TryGetValue untuk memeriksa apakah XsdDataContractExporter telah didefinisikan.
Jika TryGetValue mengembalikan
false, buat XsdDataContractExporter baru dengan skema XML yang dihasilkan dari WsdlExporter, dan tambahkan ke koleksi yang dikembalikan oleh properti State dari WsdlExporter. Sebaliknya, gunakan pengekspor yang dikembalikan oleh metode parameteroutTryGetValue.Jika XsdDataContractExporter tidak memiliki ExportOptions yang ditentukan, maka atur properti Options menjadi kelas ExportOptions dalam bentuk instans baru.
Atur properti DataContractSurrogate dari ExportOptions dari XsdDataContractExporter menjadi instans baru pengganti. Langkah-langkah berikutnya untuk mengekspor metadata tidak memerlukan perubahan apa pun.
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();