Mengenai masalah ketika layanan web yang ditulis dalam C# dipanggil di bawah Delphi
Pertama-tama, menurut saya perlu diberikan penjelasan yang relatif komprehensif tentang perkembangan layanan web di bawah platform .net. Layanan web generasi awal muncul di lingkungan e-commerce , seperti dalam aplikasi. Untuk komunikasi bisnis dan pertukaran data, tidak layak lagi menggunakan mekanisme biner seperti dcom dan corba. Apalagi dibatasi oleh platform masing-masing. hanya dapat dilakukan di bawah platform windows, sedangkan corba (objek umum meminta broker arsitektur) hanyalah produk dari platform java. Sulit bagi mereka untuk mencapai komunikasi data antar aplikasi.
Dalam konteks ini, layanan web muncul seiring dengan kebutuhan. Ini adalah solusi yang baik untuk lintas bahasa, lintas platform, dan penetrasi firewall perusahaan yang baik dan aman. Arsitekturnya umumnya dibagi menjadi lima tingkatan:
Komunikasi data melalui saluran http (protokol transfer hypertext).
formulir ekspresi data xml (bahasa markup yang dapat diperluas).
Enkapsulasi data sabun (protokol akses objek sederhana)
Format bahasa deskripsi wsdl (bahasa deskripsi layanan web)
uddi (deskripsi universal dan integrasi penemuan) deskripsi terpadu, penemuan dan integrasi
Menjadi lintas bahasa, lintas platform, dan baik serta aman dalam menembus firewall perusahaan sudah cukup membuat kami bersemangat. Namun ada juga hal-hal yang memerlukan perbaikan, seperti:
Komunikasi data HTTP lambat, terutama koneksi pertama.
Membutuhkan overhead tambahan dari server web
Setelah membahas tentang arsitektur webservice serta kelebihan dan kekurangannya, mari kita langsung ke pokok permasalahan yang menjadi topik pembahasan kita kali ini:
Masalah ketika layanan layanan web dipanggil di bawah Delphi
Tanpa basa-basi lagi, mari kita ilustrasikan dengan contoh sederhana pengujian atribut metode web: ini adalah proses bisnis sederhana untuk menyelesaikan transfer dari pelanggan a ke pelanggan b.
Pertama kita membuat layanan web di bawah .net framework1.1. Saat ini, .net akan secara otomatis membuatkan aplikasi web untuk kita.
Kita perlu membuat kelas atributtest, yang berada di bawah namespace atributtesting. Kemudian kelas ini akan secara otomatis mewarisi kelas dasarnya system.web.services.webservice. Bila diperlukan, kita dapat mengatur kelas aplikasi web Atribut layanan webnya, atribut dasarnya mencakup deskripsi dan ruang nama
[atribut layanan web(namespace=http://www.isdoo.com/services,
deskripsi=halo ansel, ini adalah layanan web pengujian!)]
pengujian atribut kelas publik : system.web.services.webservice
{
[webmethodattribute(description=Informasi deskripsi: Mewarisi metode penghitungan dan membebani nama secara berlebihan. Eksekusinya adalah mentransfer uang dari pengguna a ke pengguna b...,
//namapesan=mengubah nama pesan,
respon buffer=benar,
durasi cache=1000,
mengaktifkansesi=benar,
pilihan transaksi=transaksioption.requiresnew)]
transmoney string publik (uang ganda)
{
mencoba
{
konteksutil.enablecommit();//transaksi hanya digunakan untuk operasi database!
uang ke dalam (uang);
uang keluar darib(uang);
konteksutil.setlengkap();
transaksi pengembalian berhasil,total +money.tostring();
}
menangkap (pengecualian e)
{
konteksutil.setabort();
transaksi pengembalian gagal!
}
}
uang kekosongan pribadi ke dalam (uang ganda)
{
sqlcommand sqlcom = new sqlcommand(perbarui kumpulan anggaran money=money++money.tostring()+ di mana nama='a');
databaseaccess mydatabase = akses database baru();
sqlcom.connection=mydatabase.getconnection();
sqlcom.koneksi.open();
sqlcom.executenonquery();
sqlcom.koneksi.close();
//melempar pengecualian baru (operasi gagal saat mentransfer uang ke a!);
}
private void moneyoutfromb (uang ganda)
{
sqlcommand sqlcom = new sqlcommand(perbarui kumpulan anggaran uang=uang-+money.tostring()+ di mana nama='b');
databaseaccess mydatabase = akses database baru();
sqlcom.connection=mydatabase.getconnection();
sqlcom.koneksi.open();
sqlcom.executenonquery();
sqlcom.koneksi.close();
//lempar pengecualian baru(operasi gagal saat mentransfer uang dari b!);
}
}
Yang perlu kita perhatikan secara khusus adalah atribut webmethodat, yang juga menjadi fokus pembahasan kali ini. Selama Anda menambahkan [webmethodattribute] ke suatu metode, meskipun tidak ada atribut di dalamnya, maka layanan webnya. akan memaparkan metode ini kepada pemanggil segmen Klien. Mari kita bahas 6 atributnya di bawah ini, termasuk 2 atribut informasi deskriptif dan 4 atribut fungsional.
Atribut informasi deskriptif:
keterangan
nama pesan
4 properti fungsional:
respon buffer
durasi cache
memungkinkan sesi
opsi transaksi
Diantaranya, kita perlu memperhatikan atribut messagename. Ketika Delphi memanggil layanan web yang dikembangkan di bawah platform .net, jika Anda mengatur atribut messagename, kesalahan akan dilaporkan ketika klien memanggilnya. Ini mungkin bug, mungkin versi yang lebih baru akan menyelesaikan masalah ini. Adapun fungsi spesifik dari atribut-atribut tersebut tidak akan dijelaskan secara rinci di sini. Anda dapat membaca buku-buku yang relevan.
Di bawah ini saya akan mencantumkan langkah-langkah Delphi untuk memanggil layanan web:
Pertama-tama, jika Anda baru mengembangkan dan memanggil klien, maka Anda hanya perlu membuat aplikasi biasa. Lalu yang perlu Anda lakukan adalah mencari kontrol sabunhttpklien di bawah bilah alat layanan web, lalu meletakkannya di badan jendela aplikasi klien Anda. ;
Kedua, Anda perlu mengatur atribut url atau wsdl dari klien http sabun ini. Konten ini adalah alamat layanan layanan web Anda.
Misalnya, alamat layanan dari contoh kita saat ini adalah: http://localhost/attributetesting/attributetesting.asmx
Jika Anda ingin memasukkan wsdl maka itu adalah http://localhost/attributetesting/attributetesting.asmx?wsdl
Ini menyelesaikan pengaturan kontrol;
Kemudian kita perlu mengimpor wsdl sisi server. Anda dapat melakukannya secara manual atau menggunakan fungsi importir layanan web yang disediakan oleh Delphi.
Terakhir, Anda hanya perlu memanggil antarmuka wsdl yang diimpor. Kode kami yang sesuai di sini adalah:
prosedur tform1.bitbtn1click(pengirim: tobject);
var
aa:attributetestsoap;//Ini adalah objek antarmuka kelas di bawah wsdl
pesan: string lebar;
bb:ganda;
mulai
//httprio2 sebenarnya adalah kelas proxy, yang bertanggung jawab untuk transmisi data, mengirim permintaan, dan menerima tanggapan.
aa:=httprio2 sebagai atributtestsoap;
bb:=100,00;
msg:=aa.transmoney(bb);//Ini adalah metode layanan web yang diberikan kepada kami dengan memanggil layanan web
tampilkan pesan (pesan);
akhir;
oke! itu saja!
Unduhan populer kode sumber komersial www.html.org.cn