Bagikan melalui


Penggunaan WCF Moniker dengan Klien COM

Sampel COM menunjukkan cara menggunakan moniker layanan WCF untuk mengintegrasikan layanan Web ke dalam lingkungan pengembangan berbasis COM, seperti Microsoft Office Visual Basic untuk Aplikasi (Office VBA) atau Visual Basic 6.0. Sampel ini terdiri dari klien Host Skrip Windows (.vbs), pustaka klien pendukung (.dll), dan pustaka layanan (.dll) yang dihosting oleh Layanan Informasi Internet (IIS). Layanan ini adalah layanan kalkulator dan klien COM memanggil operasi matematika—Tambahkan, Kurangi, Kalikan, dan Bagi—pada layanan. Aktivitas klien terlihat di jendela kotak pesan.

Catatan

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

Layanan mengimplementasikan kontrak ICalculator yang didefinisikan seperti yang ditunjukkan dalam contoh kode berikut.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
}

Sampel menunjukkan tiga pendekatan alternatif untuk menggunakan moniker:

  • Kontrak Berjenis – Kontrak didaftarkan sebagai jenis COM yang terlihat pada komputer klien.

  • Kontrak WSDL – Kontrak disediakan dalam bentuk dokumen WSDL.

  • Kontrak Metadata Exchange – Kontrak diambil pada waktu pelaksanaan dari titik akhir Metadata Exchange (MEX).

Kontrak Berjenis

Untuk menggunakan moniker dengan penggunaan kontrak yang diketik, jenis yang diatribusikan dengan tepat untuk kontrak layanan harus terdaftar di COM. Pertama, klien harus dihasilkan menggunakan ServiceModel Metadata Utility Tool (Svcutil.exe). Jalankan perintah berikut dari perintah di direktori klien untuk menghasilkan proksi berjenis.

svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples http://localhost/servicemodelsamples/service.svc /out:generatedClient.cs

Kelas ini harus disertakan dalam proyek dan proyek harus dikonfigurasi untuk menghasilkan rakitan yang terlihat dan ditandatangani COM saat dikompilasi. Atribut berikut harus disertakan dalam file AssemblyInfo.cs.

[assembly: ComVisible(true)]

Setelah membangun proyek, daftarkan jenis yang terlihat COM menggunakan regasm seperti yang ditunjukkan dalam contoh berikut.

regasm.exe /tlb:CalcProxy.tlb client.dll

Rakitan yang dibuat harus ditambahkan ke Global Assembly Cache. Meskipun tidak benar-benar diperlukan, hal ini menyederhanakan proses waktu pelaksanaan menemukan perakitan. Perintah berikut menambahkan rakitan ke Global Assembly Cache.

gacutil.exe /i client.dll

Catatan

Moniker layanan hanya memerlukan pendaftaran jenis dan tidak menggunakan proksi untuk berkomunikasi dengan layanan.

ComCalcClient.vbs aplikasi klien menggunakan fungsi GetObject untuk membangun proksi untuk layanan, menggunakan sintaks moniker layanan untuk menentukan alamat, pengikatan, dan kontrak untuk layanan.

Set typedServiceMoniker = GetObject(
"service4:address=http://localhost/ServiceModelSamples/service.svc, binding=wsHttpBinding,
contractType={9213C6D2-5A6F-3D26-839B-3BA9B82228D3}")

Parameter yang digunakan oleh moniker menentukan:

  • Alamat titik akhir layanan.

  • Pengikatan yang harus digunakan klien untuk terhubung dengan titik akhir tersebut. Dalam hal ini, wsHttpBinding yang ditentukan sistem digunakan melalui pengikatan kustom dapat ditentukan dalam file konfigurasi klien. Untuk digunakan dengan Windows Script Host, pengikatan kustom ditentukan dalam file Cscript.exe.config dalam direktori yang sama dengan Cscript.exe.

  • Jenis kontrak yang didukung di titik akhir. Ini adalah jenis yang dihasilkan dan terdaftar di atas. Karena skrip Visual Basic tidak menyediakan lingkungan COM yang berjenis kuat, pengidentifikasi untuk kontrak harus ditentukan. GUID ini adalah interfaceID dari CalcProxy.tlb, yang dapat dilihat dengan menggunakan alat COM seperti OLE/COM Object Viewer (OleView.exe). Untuk lingkungan yang berjenis kuat seperti Office VBA atau Visual Basic 6.0, menambahkan referensi eksplisit ke pustaka jenis dan mendeklarasikan jenis objek proksi dapat digunakan sebagai pengganti parameter kontrak. Langkah ini juga menyediakan dukungan IntelliSense selama pengembangan aplikasi klien.

Setelah membangun instans proksi dengan moniker layanan, aplikasi klien dapat memanggil metode pada proksi, yang menghasilkan infrastruktur moniker layanan yang memanggil operasi layanan yang sesuai.

' Call the service operations using the moniker object
WScript.Echo "Typed service moniker: 100 + 15.99 = " & typedServiceMoniker.Add(100, 15.99)

Saat Anda menjalankan sampel, respons operasi ditampilkan di jendela kotak pesan Windows Script Host. Ini menunjukkan klien COM melakukan panggilan COM menggunakan moniker yang diketik untuk berkomunikasi dengan layanan WCF. Terlepas dari penggunaan COM dalam aplikasi klien, komunikasi dengan layanan hanya terdiri dari panggilan layanan Web.

Kontrak WSDL

Untuk menggunakan moniker dengan kontrak WSDL, tidak ada pendaftaran pustaka klien yang diperlukan, tetapi kontrak WSDL untuk layanan harus diambil melalui mekanisme out-of-band seperti menggunakan browser untuk mengakses titik akhir WSDL untuk layanan. Moniker kemudian dapat mengakses kontrak tersebut pada waktu eksekusi.

Aplikasi klien ComCalcClient.vbs menggunakan FileSystemObject untuk mengakses file WSDL yang disimpan secara lokal dan kemudian lagi menggunakan GetObject fungsi untuk membangun proksi untuk layanan.

' Open the WSDL contract file and read it all into the wsdlContract string
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("serviceWsdl.xml", ForReading)
wsdlContract = objFile.ReadAll
objFile.Close

' Create a string for the service moniker including the content of the WSDL contract file
wsdlMonikerString = "service4:address='http://localhost/ServiceModelSamples/service.svc'"
wsdlMonikerString = wsdlMonikerString + ", binding=WSHttpBinding_ICalculator, bindingNamespace='http://Microsoft.ServiceModel.Samples'"
wsdlMonikerString = wsdlMonikerString + ", wsdl='" & wsdlContract & "'"
wsdlMonikerString = wsdlMonikerString + ", contract=ICalculator, contractNamespace='http://Microsoft.ServiceModel.Samples'"

' Create the service moniker object
Set wsdlServiceMoniker = GetObject(wsdlMonikerString)

Parameter yang digunakan oleh moniker menentukan:

  • Alamat titik akhir layanan.

  • Pengikatan yang harus digunakan klien untuk terhubung dengan titik akhir tersebut dan namespace tempat pengikatan tersebut ditentukan. Dalam hal ini, wsHttpBinding_ICalculator digunakan.

  • WSDL yang mendefinisikan kontrak. Dalam hal ini adalah string yang telah dibaca dari file serviceWsdl.xml.

  • Nama dan namespace kontrak. Identifikasi ini diperlukan karena WSDL mungkin berisi lebih dari satu kontrak.

    Catatan

    Secara default, layanan WCF menghasilkan file WSDL terpisah untuk setiap namespace layanan yang digunakan. Ini ditautkan dengan penggunaan konstruksi impor WSDL. Karena moniker mengharapkan satu definisi WSDL, layanan harus menggunakan satu namespace seperti yang ditunjukkan dalam sampel ini atau file terpisah harus digabungkan secara manual.

Setelah membangun instans proksi dengan moniker layanan, aplikasi klien dapat memanggil metode pada proksi, yang menghasilkan infrastruktur moniker layanan yang memanggil operasi layanan yang sesuai.

' Call the service operations using the moniker object
WScript.Echo "WSDL service moniker: 145 - 76.54 = " & wsdlServiceMoniker.Subtract(145, 76.54)

Saat Anda menjalankan sampel, respons operasi ditampilkan di jendela kotak pesan Windows Script Host. Ini menunjukkan klien COM melakukan panggilan COM menggunakan moniker dengan kontrak WSDL untuk berkomunikasi dengan layanan WCF.

Kontrak Exchange Metadata

Untuk menggunakan moniker dengan kontrak MEX, seperti kontrak WSDL, tidak diperlukan pendaftaran klien. Kontrak untuk layanan diambil pada waktu eksekusi melalui penggunaan internal Metadata Exchange.

Aplikasi klien ComCalcClient.vbs kembali menggunakan fungsi GetObject untuk membangun proksi untuk layanan.

' Create a string for the service moniker specifying the address to retrieve the service metadata from
mexMonikerString = "service4:mexAddress='http://localhost/servicemodelsamples/service.svc/mex'"
mexMonikerString = mexMonikerString + ", address='http://localhost/ServiceModelSamples/service.svc'"
mexMonikerString = mexMonikerString + ", binding=WSHttpBinding_ICalculator, bindingNamespace='http://Microsoft.ServiceModel.Samples'"
mexMonikerString = mexMonikerString + ", contract=ICalculator, contractNamespace='http://Microsoft.ServiceModel.Samples'"

' Create the service moniker object
Set mexServiceMoniker = GetObject(mexMonikerString)

Parameter yang digunakan oleh moniker menentukan:

  • Alamat titik akhir pertukaran metadata layanan.

  • Alamat titik akhir layanan.

  • Pengikatan yang harus digunakan klien untuk terhubung dengan titik akhir tersebut dan namespace tempat pengikatan tersebut ditentukan. Dalam hal ini, wsHttpBinding_ICalculator digunakan.

  • Nama dan namespace kontrak. Identifikasi ini diperlukan karena WSDL mungkin berisi lebih dari satu kontrak.

Setelah membangun instans proksi dengan moniker layanan, aplikasi klien dapat memanggil metode pada proksi, yang menghasilkan infrastruktur moniker layanan yang memanggil operasi layanan yang sesuai.

' Call the service operations using the moniker object
WScript.Echo "MEX service moniker: 9 * 81.25 = " & mexServiceMoniker.Multiply(9, 81.25)

Saat Anda menjalankan sampel, respons operasi ditampilkan di jendela kotak pesan Windows Script Host. Ini menunjukkan klien COM melakukan panggilan COM menggunakan moniker dengan kontrak MEX untuk berkomunikasi dengan layanan WCF.

Untuk menyiapkan dan membangun sampel

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

  2. Untuk membangun solusi edisi C# atau Visual Basic .NET, ikuti petunjuknya di Membangun Sampel WCF.

  3. Dari Perintah Pengembang untuk Visual Studio, buka folder \client\bin, di bawah folder khusus bahasa.

    Catatan

    Jika Anda menggunakan Windows Vista, Windows Server 2008, Windows 7, atau Windows Server 2008 R2, pastikan Anda menjalankan prompt perintah dengan hak istimewa administrator.

  4. Ketik tlbexp.exe client.dll /out:CalcProxy.tlb untuk mengekspor dll ke file tlb. "Peringatan pengekspor pustaka jenis" diharapkan tetapi bukan masalah karena jenis generik tidak diperlukan.

  5. Ketik regasm.exe /tlb:CalcProxy.tlb client.dll untuk mendaftarkan jenis dengan COM. "Peringatan pengekspor pustaka jenis" diharapkan tetapi bukan masalah karena jenis generik tidak diperlukan.

  6. Ketik gacutil.exe /i client.dll untuk menambahkan assembly ke Global Assembly Cache.

Untuk menjalankan sampel di komputer yang sama

  1. Uji bahwa Anda dapat mengakses layanan menggunakan browser dengan mengetikkan alamat berikut: http://localhost/servicemodelsamples/service.svc. Halaman konfirmasi harus ditampilkan sebagai respons.

  2. Jalankan ComCalcClient.vbs dari \client, dari bawah folder khusus bahasa. Aktivitas klien ditampilkan di jendela kotak pesan.

  3. Jika klien dan layanan tidak dapat berkomunikasi, lihat Tips Pemecahan Masalah untuk Sampel WCF.

Untuk menjalankan sampel di seluruh komputer

  1. Di komputer layanan, buat direktori virtual bernama ServiceModelSamples. Skrip Setupvroot.bat yang disertakan dengan sampel dapat digunakan untuk membuat direktori disk dan direktori virtual.

  2. Salin file program layanan dari %SystemDrive%\Inetpub\wwwroot\servicemodelsamples ke direktori virtual ServiceModelSamples di komputer layanan. Pastikan untuk menyertakan file dalam direktori \bin.

  3. Salin file skrip klien dari folder \client, di bawah folder khusus bahasa, ke komputer klien.

  4. Dalam file skrip, ubah nilai alamat definisi titik akhir agar sesuai dengan alamat baru layanan Anda. Ganti referensi apa pun ke "localhost" dengan nama domain yang sepenuhnya memenuhi syarat di alamat.

  5. Salin file WSDL ke komputer klien. Di file WSDL, serviceWsdl.xml, ganti referensi apa pun ke "localhost" dengan nama domain yang sepenuhnya memenuhi syarat di alamat.

  6. Salin pustaka Client.dll dari folder \client\bin\, di bawah folder khusus bahasa, ke satu direktori di komputer klien.

  7. Dari prompt perintah, navigasikan ke direktori tujuan tersebut di komputer klien. Jika menggunakan Windows Vista atau Windows Server 2008, pastikan untuk menjalankan prompt perintah sebagai Administrator.

  8. Ketik tlbexp.exe client.dll /out:CalcProxy.tlb untuk mengekspor dll ke file tlb. "Peringatan pengekspor pustaka jenis" diharapkan tetapi bukan masalah karena jenis generik tidak diperlukan.

  9. Ketik regasm.exe /tlb:CalcProxy.tlb client.dll untuk mendaftarkan jenis dengan COM. Pastikan jalur telah diatur ke folder yang berisi regasm.exe sebelum Anda menjalankan perintah.

  10. Ketik gacutil.exe /i client.dll untuk menambahkan assembly ke Global Assembly Cache. Pastikan jalur telah diatur ke folder yang berisi gacutil.exe sebelum Anda menjalankan perintah.

  11. Uji apakah Anda dapat mengakses layanan dari komputer klien menggunakan browser.

  12. Di komputer klien, luncurkan ComCalcClient.vbs.

Untuk membersihkan sampel

Untuk tujuan keamanan, hapus definisi dan izin direktori virtual yang diberikan dalam langkah-langkah penyiapan saat Anda selesai dengan sampel.