Bagikan melalui


Mengambil Metadata

Sampel RetrieveMetadata menunjukkan cara mengimplementasikan klien yang secara dinamis mengambil data dari layanan untuk memilih titik akhir yang digunakan untuk berkomunikasi. Sampel ini berdasarkan Memulai. Layanan telah dimodifikasi untuk mengekspos dua titik akhir—satu titik akhir di alamat dasar menggunakan pengikatan basicHttpBinding, dan titik akhir aman di {baseaddress}/secure menggunakan pengikatan wsHttpBinding. Alih-alih mengonfigurasi klien dengan alamat dan pengikatan titik akhir, klien secara dinamis mengambil metadata untuk layanan menggunakan kelas MetadataExchangeClient dan kemudian mengimpor metadata sebagai ServiceEndpointCollection menggunakan kelas WsdlImporter.

Catatan

Prosedur penyiapan dan petunjuk pembuatan untuk sampel ini terdapat di akhir topik ini.

Aplikasi klien menggunakan ServiceEndpointCollection yang diimpor untuk membuat klien berkomunikasi dengan layanan. Aplikasi klien melakukan iterasi melalui setiap titik akhir yang diambil dan berkomunikasi dengan setiap titik akhir yang mengimplementasikan kontrak ICalculator. Alamat dan pengikatan yang sesuai disediakan dengan titik akhir yang diambil, sehingga klien dikonfigurasi untuk berkomunikasi dengan setiap titik akhir, seperti yang ditunjukkan dalam kode sampel berikut.

// Create a MetadataExchangeClient for retrieving metadata.
EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress);

// Retrieve the metadata for all endpoints using metadata exchange protocol (mex).
MetadataSet metadataSet = mexClient.GetMetadata();

//Convert the metadata into endpoints.
WsdlImporter importer = new WsdlImporter(metadataSet);
ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();

CalculatorClient client = null;
ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
// Communicate with each endpoint that supports the ICalculator contract.
foreach (ServiceEndpoint ep in endpoints)
{
    if (ep.Contract.Namespace.Equals(contract.Namespace) && ep.Contract.Name.Equals(contract.Name))
    {
        // Create a client using the endpoint address and binding.
        client = new CalculatorClient(ep.Binding, new EndpointAddress(ep.Address.Uri));
        Console.WriteLine("Communicate with endpoint: ");
        Console.WriteLine("   AddressPath={0}", ep.Address.Uri.PathAndQuery);
        Console.WriteLine("   Binding={0}", ep.Binding.Name);
        // Call operations.
        DoCalculations(client);

        //Closing the client gracefully closes the connection and cleans up resources.
        client.Close();
    }
}

Jendela konsol klien menampilkan operasi yang dikirim ke setiap titik akhir, yang menampilkan jalur alamat dan nama pengikatan.

Untuk menyiapkan, membangun, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan Satu Kali untuk Sampel Windows Communication Foundation.

  2. Untuk membangun solusi edisi C#, C++, atau Visual Basic .NET, ikuti instruksi dalam Membangun Sampel Windows Communication Foundation.

  3. Untuk menjalankan sampel dalam konfigurasi satu atau lintas komputer, ikuti instruksi pada Menjalankan Sampel WCF.