Bagikan melalui


Mengambil Metadata

Sampel RetrieveMetadata menunjukkan cara mengimplementasikan klien yang secara dinamis mengambil metadata dari layanan untuk memilih titik akhir untuk berkomunikasi. Sampel ini didasarkan pada Panduan Memulai. Layanan telah dimodifikasi untuk mengekspos dua titik akhir—titik akhir di alamat dasar menggunakan basicHttpBinding pengikatan, dan titik akhir aman di {baseaddress}/secure menggunakan wsHttpBinding pengikatan. Daripada 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.

Nota

Prosedur penyiapan dan instruksi build untuk sampel ini terletak di akhir topik ini.

Aplikasi klien menggunakan yang diimpor ServiceEndpointCollection guna membuat klien untuk berkomunikasi dengan layanan. Aplikasi klien melakukan iterasi melalui setiap titik akhir yang diambil dan berkomunikasi dengan setiap titik akhir yang mengimplementasikan ICalculator kontrak. 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, menampilkan jalur alamat dan nama pengikatan.

Untuk menyiapkan, mengompilasi, dan menjalankan sampel

  1. Pastikan Anda telah melakukan Prosedur Penyiapan One-Time 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 di Menjalankan Sampel Windows Communication Foundation.