Pada tahun berapa layanan web sabun muncul. Daftar kelas PersonServiceImpl

Sebagai Internet berkembang, ada kebutuhan untuk membuat aplikasi terdistribusi. Aplikasi yang diinstal pada komputer biasanya menggunakan perpustakaan yang dihosting di dalamnya. Satu perpustakaan dapat digunakan oleh beberapa program. Apakah mungkin untuk meng-host analog perpustakaan di web sehingga situs yang berbeda dapat memanggilnya? Ternyata ya.

Perusahaan menyediakan berbagai informasi di halaman mereka. Misalnya, dari situs webnya http://www.Ford.com, perusahaan Ford menerbitkan informasi tentang model dan harga. Dealer perusahaan ini ingin memiliki informasi ini di situs web mereka. Layanan Web memungkinkan situs konsumen untuk mengambil informasi dari situs penyedia. Situs konsumen menampilkan informasi ini di halamannya. Kode untuk menghasilkan informasi ini ditulis sekali, tetapi dapat digunakan oleh banyak konsumen. Data disajikan dalam teks biasa, sehingga dapat digunakan terlepas dari platformnya.

Layanan web banyak digunakan di aplikasi Desktop dan Internet. Mereka bukan aplikasi itu sendiri, tetapi sumber data untuk aplikasi. Mereka kekurangan antarmuka pengguna. Layanan web tidak harus digunakan melalui web - mereka dapat menjadi bagian dari proyek di mana mereka digunakan.

Layanan web adalah fungsionalitas dan data yang disediakan untuk digunakan oleh aplikasi eksternal yang berinteraksi dengan layanan melalui protokol standar dan format data. Layanan web sepenuhnya independen dari bahasa dan platform implementasi. Teknologi layanan web adalah landasan model pemrograman Microsoft. BERSIH.

Ini pengembangan lebih lanjut pemrograman komponen CORBA dan DCOM. Namun, untuk menggunakan komponen tersebut, perlu mendaftarkannya di sistem konsumen. Ini tidak diperlukan untuk layanan web. Komponen bekerja dengan baik di jaringan lokal. Protokol HTTP tidak cocok untuk panggilan prosedur jarak jauh ( RPC ). Bahkan dalam organisasi yang sama, berbeda Sistem operasi, yang hanya dapat berkomunikasi melalui HTTP .

Beberapa upaya dilakukan untuk membuat bahasa komunikasi antara sistem heterogen - DCOM, CORBA, RMI, IIOP. Mereka tidak mendapatkan penerimaan umum, karena masing-masing dipromosikan oleh pabrikan yang berbeda dan karena itu terikat pada teknologi pabrikan tertentu. Tidak ada yang mau menerima standar orang lain. Untuk mengatasi dilema ini, beberapa perusahaan telah sepakat untuk mengembangkan standar vendor-independen untuk pengiriman pesan melalui HTTP. Pada Mei 2000, IBM, Microsoft, HP, Lotus, SAP, UserLand, dan lainnya beralih ke W3C dan mengajukan SOAP sebagai kandidat untuk standar semacam itu. SOAP merevolusi pengembangan aplikasi dengan menggabungkan dua standar Internet, HTTP dan XML.

SABUN MANDI

Protokol SOAP berdasarkan XML digunakan untuk berinteraksi dengan layanan web. Dimungkinkan untuk hanya menggunakan XML , tetapi format ini terlalu longgar, di mana setiap dokumen sebenarnya membuat bahasanya sendiri. SABUN MANDI adalah konvensi tentang format dokumen XML, tentang keberadaan elemen dan ruang nama tertentu di dalamnya.

SOAP memungkinkan Anda untuk mempublikasikan dan menggunakan struktur data yang kompleks seperti DataSet. Pada saat yang sama, mudah dipelajari. Versi sekarang SOAP-1.2.

SOAP adalah Protokol Akses Objek Sederhana. SOAP dirancang untuk memudahkan aplikasi berkomunikasi melalui HTTP. Ini adalah format pesan Internet platform-independen khusus. Pesan SOAP hanyalah dokumen XML biasa. Standar

Bagian lirik.

Bayangkan Anda telah mengimplementasikan atau sedang menerapkan sistem tertentu yang seharusnya tersedia dari luar. Itu. ada server tertentu yang Anda butuhkan untuk berkomunikasi. Misalnya server web.

Server ini dapat melakukan banyak tindakan, bekerja dengan database, melakukan beberapa permintaan pihak ketiga ke server lain, melakukan beberapa perhitungan, dll. hidup dan mungkin berkembang sesuai dengan skenarionya yang terkenal (yaitu, menurut skenario pengembang). Tidak menarik bagi seseorang untuk berkomunikasi dengan server seperti itu, karena dia mungkin tidak dapat / tidak ingin memberikan halaman yang indah dengan gambar dan konten ramah pengguna lainnya. Itu ditulis dan berfungsi untuk bekerja dan mengeluarkan data untuk permintaan itu, tanpa peduli bahwa itu dapat dibaca manusia, klien akan menanganinya sendiri.

Sistem lain, yang mengakses server ini, sudah dapat membuang data yang diterima dari server ini atas kebijakan mereka sendiri - memproses, mengakumulasi, menerbitkan ke klien mereka, dll.

Nah, salah satu opsi untuk berkomunikasi dengan server tersebut adalah SOAP. Protokol pesan XML SOAP.

Bagian praktis.

Layanan web (itulah yang disediakan server dan apa yang digunakan klien) memungkinkan untuk berkomunikasi dengan server dalam pesan yang terstruktur dengan baik. Faktanya adalah bahwa layanan web tidak menerima data apa pun. Pesan apa pun yang tidak sesuai dengan aturan akan dikembalikan oleh layanan web dengan kesalahan. Omong-omong, kesalahannya akan berupa xml dengan struktur yang jelas (yang tidak dapat dikatakan benar tentang teks pesan).

WSDL (Bahasa Deskripsi Layanan Web). Aturan di mana pesan disusun untuk layanan web dijelaskan dengan cara yang sama dengan menggunakan xml dan juga memiliki struktur yang jelas. Itu. jika layanan web menyediakan kemampuan untuk memanggil metode, itu harus memungkinkan klien untuk mengetahui parameter apa untuk metode ini yang digunakan. Jika layanan web mengharapkan string untuk metode Method1 sebagai parameter, dan string harus diberi nama Param1, maka aturan ini akan ditentukan dalam deskripsi layanan web.

Tidak hanya tipe sederhana, tetapi juga objek, koleksi objek dapat dilewatkan sebagai parameter. Deskripsi objek direduksi menjadi deskripsi setiap komponen objek. Jika objek terdiri dari beberapa bidang, maka masing-masing bidang dijelaskan, jenisnya apa, namanya (berapa nilai yang mungkin). Bidang juga dapat berupa tipe kompleks, dan seterusnya, hingga deskripsi tipe diakhiri dengan yang sederhana - string, boolean, angka, tanggal... Namun, beberapa tipe tertentu mungkin menjadi sederhana, penting bahwa klien dapat memahami nilai-nilai apa yang dapat terkandung di dalamnya.

Untuk klien, cukup mengetahui url layanan web, wsdl akan selalu ada di dekatnya, di mana Anda bisa mendapatkan ide tentang metode dan parameternya yang disediakan layanan web ini.

Apa keuntungan dari semua lonceng dan peluit ini:

  • Di sebagian besar sistem, deklarasi metode dan tipe terjadi di mode otomatis. Itu. cukup bagi programmer di server untuk mengatakan itu metode ini dapat dipanggil melalui layanan web, dan deskripsi wsdl akan dibuat secara otomatis.
  • Deskripsi yang memiliki struktur yang jelas dapat dibaca oleh klien sabun mana pun. Itu. apa pun layanan webnya, klien akan memahami data apa yang diterima layanan web. Menurut deskripsi ini, klien dapat membangun struktur internal kelas objeknya sendiri, yang disebut. binding" dan. Akibatnya, programmer yang menggunakan layanan web harus menulis sesuatu seperti (pseudocode):

    Pengguna Baru:=TSoapUser.Create("Vasya", "Pupkin", "admin"); sabun.AddUser(Pengguna Baru);

  • Validasi otomatis.

    • validasi xml. xml harus dibentuk dengan baik. xml tidak valid - segera terjadi kesalahan pada klien, biarkan dia mencari tahu.
    • validasi skema. xml harus memiliki struktur tertentu. xml tidak cocok dengan skema - segera terjadi kesalahan pada klien, biarkan dia mencari tahu.
    • validasi data dilakukan oleh server sabun agar tipe data dan batasannya sesuai dengan deskripsi.
  • Otorisasi dan otentikasi dapat diimplementasikan metode terpisah. secara asli. atau menggunakan otorisasi http.
  • Layanan web dapat bekerja baik melalui protokol sabun maupun melalui http, yaitu melalui permintaan get. Artinya, jika data sederhana (tanpa struktur) digunakan sebagai parameter, maka Anda cukup memanggil www.site.com/users.asmx/GetUser?Name=Vasia atau pos biasa. Namun, ini tidak selalu dan di mana-mana.
  • ... lihat wikipedia

Ada banyak kontra juga:

  • Ukuran pesan yang terlalu besar. Nah, di sini sifat xml adalah sedemikian rupa sehingga formatnya berlebihan, semakin banyak tag, semakin banyak informasi yang tidak berguna. Ditambah sabun menambah redundansinya. Untuk sistem intranet, masalah lalu lintas kurang akut daripada untuk internet, jadi sabun untuk jaringan lokal lebih diminati, khususnya, Sharepoint memiliki layanan web sabun yang dengannya Anda dapat berkomunikasi dengan sukses (dan beberapa batasan).
  • Perubahan otomatis deskripsi layanan web dapat merusak semua klien. Yah, ini seperti untuk sistem apa pun, jadi jika kompatibilitas mundur dengan metode lama tidak didukung, semuanya akan jatuh ...
  • Bukan minus, tapi kekurangan. Semua tindakan panggilan metode harus atomik. Misalnya, saat bekerja dengan subd, kita dapat memulai transaksi, mengeksekusi beberapa kueri, lalu melakukan rollback atau commit. Tidak ada transaksi dalam sabun. Satu permintaan, satu tanggapan, percakapan selesai.
  • Berurusan dengan deskripsi apa yang ada di sisi server (apakah semuanya dijelaskan dengan benar oleh saya?), Apa yang ada di klien (apa yang ditulis untuk saya di sini?) Bisa sangat sulit. Ada beberapa kali ketika saya harus berurusan dengan sisi klien dan meyakinkan programmer server bahwa dia telah salah menggambarkan data, tetapi dia tidak dapat memahami apa pun di dalamnya, karena pembuatan otomatis dan dia, seolah-olah, seharusnya tidak, ini adalah masalah perangkat lunak. Dan kesalahannya secara alami ada dalam kode metode, programmer tidak melihatnya.
  • Praktek menunjukkan bahwa pengembang layanan web sangat jauh dari orang-orang yang menggunakan layanan web ini. Menanggapi permintaan apa pun (berlaku dari luar), kesalahan yang tidak dapat dipahami "Kesalahan 5. Semuanya buruk" mungkin terjadi. Semua tergantung hati nurani developer :)
  • Aku yakin aku tidak mengingat apapun...

Sebagai contoh, ada layanan web belavia terbuka:

  • http://86.57.245.235/TimeTable/Service.asmx - titik masuk, ada juga deskripsi teks metode untuk pengembang pihak ketiga.
  • http://86.57.245.235/TimeTable/Service.asmx?WSDL - deskripsi wsdl tentang metode dan jenis data yang diterima dan dikembalikan.
  • http://86.57.245.235/TimeTable/Service.asmx?op=GetAirportsList - deskripsi metode tertentu dengan contoh jenis permintaan xml dan respons xml.

Anda dapat membuat dan mengirim permintaan secara manual seperti:

POST /TimeTable/Service.asmx HTTP/1.1 Host: 86.57.245.235 Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://webservices.belavia.by/GetAirportsList" id

jawabannya akan:

HTTP/1.1 200 OK Tanggal: Sen, 30 Sep 2013 00:06:44 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET X-AspNet-Version: 4.0.30319 Cache-Control: private, max -age=0 Tipe-Konten: teks/xml; charset=utf-8 Panjang Konten: 2940

Layanan web Ancaman Aeroflot dibuka lebih awal, tetapi setelah 1C menambahkan dukungan untuk sabun di 8ku, sekelompok penguji beta 1c berhasil menginstalnya. Sekarang ada yang berubah di sana (saya tidak tahu alamatnya, Anda dapat mencari jika Anda tertarik).
Penafian ZZY. Dia berbicara di tingkat rumah tangga. Anda bisa minum.

Penafian:Banyak artikel telah ditulis tentang topik ini dan, seperti yang Anda, tentu saja, duga, ini adalah yang lain. Mungkin Anda akan belajar sesuatu yang baru darinya, tetapi tidak ada rahasia yang tidak dapat Anda google sendiri yang tidak dijelaskan di sini. Hanya catatan dari pengalaman pribadi.

pengantar

Kami hanya akan mempertimbangkan situasi ketika ada layanan web pihak ketiga dan tugasnya adalah melakukan pertukaran data.

Struktur layanan dijelaskan dalam file WSDL(eng. Bahasa Deskripsi Layanan Web)

File paling sering diakses melalui tautan di mana titik masuk ke layanan web itu sendiri berada. Saya menulis "paling sering" karena ada pengecualian. Misalnya, layanan Web berbasis SAP tidak menerbitkan wsdl dan hanya dapat diambil dari aplikasi itu sendiri.

Jadi, kami memiliki deskripsi layanan web, login, kata sandi. Mari terhubung.

// Tentukan pengaturan URL ServiceNamespace = "http://Somesite.ru"; Nama Pengguna = "Pengguna Uji"; Sandi = "q1w2e3"; LocationWSDL = "https://Somesite.ru/WebService/Some?wsdl"; ServiceName = "SomeServiceName"; ConnectionPointName = "SomeService_Port"; // Buat koneksi SSL = New SecureConnectionOpenSSL(); WSDefinition = WSDefinition Baru(LocationWSDL,SSL); WSProxy = WSProxy Baru(WSDefinition, URL ServiceNamespace, ServiceName, ConnectionPointName, SSL); WSProxy.User = Nama Pengguna; WSProxy.Password = Kata Sandi;

Bagus! Kami telah terhubung ke layanan web! Secara teori, ini adalah dasar dari opsi pertukaran apa pun, karena memungkinkan Anda untuk membuat objek struktur data berdasarkan wsdl, dan bekerja dengan objek seperti itu adalah suatu kesenangan.

Pertimbangkan XML yang SoapUI berikan kepada kita

357 121212 M 19900111 Mercedes GLS audi TT

Sekarang mari kita jelaskan secara terprogram

// Buat objek dan isi dengan data OwnXDTOFactory = WSDefinition.XDTOFactory; RootType = OwnFactoryXDTO.Type(URLServiceNamespace, "SUBMISSION"); RootObject = OwnFactoryXDTO.Create(RootType); RootObject.ID = "4356"; ClientType = OwnFactoryXDTO.Type(URLServiceNamespace, "CUSTOMER"); ClientObject = OwnFactoryXDTO.Create(Tipe Klien); ClientObject.CLIENT_ID = "121212"; ClientObject.SEX = "M"; // F - perempuan, M - laki-laki ClientObject.CLIENT_BIRTHDAY = "19900111"; // AutoType Mobil Pelanggan = CustomFactoryXDTO.Type(URLServiceNamespace, "CARS"); AutoObject = OwnFactoryXDTO.Create(TipeOtomatis); AutoObject.CLASS = "Mercedes"; AutoObject.MODEL = "GLS"; ClientObject.CARS.Add(AutoObject); AutoObject = OwnFactoryXDTO.Create(TipeOtomatis); AutoObject.CLASS = "Audi"; AutoObject.MODEL = "TT"; ClientObject.CARS.Add(AutoObject); RootObject.CUSTOMER.Add(ClientObject);

Data berhasil diselesaikan. Sekarang kita perlu mengirim mereka.

Pada saat ini, banyak nuansa muncul. Mari kita coba pertimbangkan masing-masing.

Resep 1. Mengirim Seluruh Objek XDTO

Hasil = WSProxy.AddCustomers(RootObject);

Tetap hanya untuk memproses hasil bahwa layanan dikembalikan kepada kami dan hanya itu. Setuju bahwa itu sangat nyaman!

Namun dalam praktiknya tidak selalu demikian. Misalnya, 1c tidak cocok dengan awalan tag tertentu di dalam xml ketika namespace dari tag root berbeda dari tag anak. Dalam kasus seperti itu, Anda harus mengumpulkan sabun secara manual. Saya juga harus berurusan dengan layanan web yang mengharapkan xml murni sebagai parameter. Kegilaan, tapi tetap saja itu tidak terlalu sulit untuk dilakukan.

Resep 2. Mengirim xml murni sebagai parameter

XMLRecordParameters = NewXMLRecordParameters("UTF-8", "1.0", Benar); MyXML = XMLWriter Baru; MyXML.SetString(XMLRecordParameters); MyXML.WriteDeclarationXML(); CustomXDTOFactory.WriteXML(MyXML, RootObject); StringXML = MyXML.Tutup(); Jika DeleteNamespaceDescription Kemudian AttemptFirstTagInString = StrGetString(XMLString,2); RootTagName = RootObject.Type().Name; XMLString = StrReplace(XMLString, FirstTagInString, "<"+ИмяКорневогоТэга+">"); Pengecualian //ErrorDescription() EndTry; EndIf; Hasil = WSProxy.AddCustomers(XML String);

Jika Anda tidak menghapus namespace yang ditambahkan 1s secara default, maka itu telah menjadi lebih dari hanya 5 baris kode. Sebagian besar waktu, saya membungkus transformasi xml dalam suatu fungsi, karena kami biasanya memanggil lebih dari satu metode.

Resep 3. Kirim melalui Permintaan HTTP asli.

string sabun = " | | |" +StringXML+ " | |"; // Menjelaskan header permintaan HTTP Header = Pencocokan Baru; Headers.Insert("Content-Type", "text/xml;charset=UTF-8"); Headers.Insert("SOAPAction", "http:// sap .com/xi/WebService/soap1.1"); Headers.Insert("Authorization", "Basic "+GetBase64AuthorizationHeader(Username, Password)); // ATTENTION!!! // Anda tidak dapat mengisi header berikut secara terprogram karena ini menyebabkan kesalahan // Platform akan mengisinya dengan benar //Headers.Insert("Accept-Encoding", "gzip,deflate"); //Headers.Insert("Content-Length", Format(StringLength(SOAP String)," HG=")); // panjang pesan //Headers.Insert("Host", "Somesite.ru:8001"); //Headers.Insert("Connection", "Keep-Alive"); //Header. Insert("User-Agent", "Apache-HttpClient/4.1.1 (java 1.5)"); // Hubungkan ke situs. Connection = New HTTPConnection("Somesite.ru/WebService/Some",Nama Pengguna , Password,SSL, false); // Alamat harus tanpa https:// // Dapatkan teks halaman root melalui permintaan POST. c = New HTTPRequest("/GetCustomer", Header); HTTPRequest.SetBodyFromString(SOAPString); Hasil = Connection.CallHTTPMethod("POST", HTTPRequest);

Dalam opsi ini, kita harus membuat sabun secara manual. Intinya, kita cukup membungkus xml dari resep 2 dalam pembungkus sabun, di mana, tergantung pada persyaratan layanan web, kita dapat mengubah sabun kita sepuasnya.

Selanjutnya, kami menjelaskan header sesuai dengan dokumentasi. Beberapa layanan akan dengan mudah mengunyah permintaan kami tanpa header, di sini Anda perlu melihat kasus tertentu. Jika Anda tidak tahu header apa yang harus ditentukan, maka cara termudah adalah mengintip permintaan di SoapUI dengan beralih ke tab RAW.

Fungsi untuk mendapatkan string Base64 terlihat seperti ini (diintip):

Fungsi GetBase64AuthorizationHeader(Nama Pengguna, Kata Sandi) FileEncoding = TextEncoding.UTF8; TempFile = GetTemporaryFileName(); Rekam = New TextWrite(TemporaryFile, FileEncoding); Tulis.Tulis(Nama Pengguna+":"+Kata Sandi); Rekam.Tutup(); BinData = BinaryData Baru(TempFile); Hasil = Base64String(DvData); HapusFile(TempFile); Hasil = Rata-rata(Hasil,5); Hasil Pengembalian; Fungsi Akhir

Ada poin penting. Saat bekerja dengan HTTPConnection, tentukan alamat tanpa menentukan protokol "http://" dan "https://", jika tidak, Anda berisiko membuang waktu untuk mencari kesalahan yang tidak terlihat.

Resep 4. Mengirim melalui WinHttpRequest

WinHttp = COMObject Baru("WinHttp.WinHttpRequest.5.1"); WinHttp.Option(2,"UTF-8"); WinHttp.Option(4, 13056); //intSslErrorIgnoreFlag WinHttp.Option(6, benar); //blnEnableRedirects WinHttp.Option(12, true); //blnEnableHttpsToHttpRedirects WinHttp.Open("POST", "https://Somesite.ru/WebService/Some/GetCustomer", 0); WinHttp.SetRequestHeader("Tipe-konten", "teks/xml"); WinHttp.SetCredentials(Nama Pengguna, Kata Sandi, 0); WinHttp.Send(SOAP String); WinHttp.WaitForResponse(15); XMLResponse = WinHttp.ResponseText();

Di sini, sebenarnya, sama seperti di versi sebelumnya, tetapi kami bekerja dengan COMObject. Kami menentukan string koneksi secara penuh, bersama dengan protokolnya. Perhatian khusus harus diberikan hanya pada tanda untuk mengabaikan kesalahan dalam sertifikat SSL. Mereka diperlukan jika kami bekerja melalui SSL, tetapi tanpa sertifikat khusus, karena tidak mungkin membuat koneksi aman baru dalam opsi ini (atau saya tidak tahu caranya). Mekanisme lainnya mirip dengan yang sebelumnya.

Selain itu, selain "WinHttp.WinHttpRequest.5.1", Anda dapat menggunakan "Microsoft.XMLHTTP", "Msxml2.XMLHTTP", "Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP.6.0", jika tiba-tiba tidak mengambil mati di WinHttp. Metodenya hampir sama, hanya jumlah parameternya yang berbeda. Saya menduga bahwa salah satu opsi ini terhubung ke dalam objek HTTPRequest 1c.

Saat ini, ini semua resep yang saya miliki. Jika saya menemukan yang baru, saya pasti akan melengkapi artikel ini.

Pemrosesan hasil

Dalam resep 1, kita paling sering mendapatkan objek XDTO yang sudah jadi dan bekerja dengannya sebagai struktur. Dalam semua kasus lain, Anda dapat mengonversi respons xml ke XDTO

Jika Result.StatusCode = 200 Maka XMLReader = New XMLReader; MembacaXML.SetString(Hasil.GetBodyAsString()); ResponseObject = OwnFactoryXDTO.ReadXML(ReadingXML); Laporan(ObjectResponse.Body.Response.RESPONSE_ID); Laporan(ObjectResponse.Body.Response.RESPONSE_TEXT); Berakhir jika;

Semuanya sederhana di sini.

Alih-alih sebuah kesimpulan

1. Mulai bekerja dengan layanan web dengan program SoapUI. Ini dirancang untuk pekerjaan seperti itu dan akan memungkinkan Anda untuk dengan cepat memahami cara kerja layanan tertentu. Ada artikel untuk dipelajari

2. Jika Anda bertukar dengan layanan melalui saluran http yang tidak aman dan muncul pertanyaan tentang apa yang sebenarnya dikirimkan oleh 1s dalam pesan Anda, maka Anda dapat menggunakan sniffer lalu lintas seperti Wireshark, Fiddler, dan lainnya. Masalahnya hanya terjadi jika Anda menggunakan koneksi ssl.

3. Jika, bagaimanapun, layanan web berkomunikasi melalui https, maka kami menginstal server Nginx pada mesin jarak jauh (apa saja, yang paling penting, bukan milik kami sendiri), yang akan kami hubungi, dan itu, pada gilirannya, akan mengemas semuanya https dan kirimkan ke tempat yang tepat ( proxy terbalik ) dan tambahkan ke konfigurasi standar:

Server ( dengarkan 0.0.0.0:8080; server_name MyServer; lokasi ~ .* ( proxy_pass https://Somesite.ru:8001; proxy_set_header Host $host; proxy_set_header Otorisasi "Dasar "; proxy_pass_header Otorisasi; ))

5. Jika otentikasi melibatkan penggunaan Cookie, maka yang berikut ini ditemukan:

P.S. Jika Anda memiliki pertanyaan, saran untuk memperbaiki kode, memiliki resep Anda sendiri yang berbeda dari yang dijelaskan, Anda menemukan kesalahan atau berpikir bahwa penulisnya "salah" dan dia "tidak termasuk dalam 1s", kemudian tulis komentar dan kami akan membahasnya semuanya.

Judul topik benar-benar sebuah pertanyaan, karena Saya sendiri tidak tahu apa itu dan untuk pertama kalinya saya akan mencoba bekerja dengannya dalam kerangka artikel ini. Satu-satunya hal yang dapat saya jamin adalah bahwa kode di bawah ini akan berfungsi, namun, frasa saya hanya akan menjadi asumsi dan tebakan tentang bagaimana saya sendiri memahami semua ini. Jadi ayo pergi...

pengantar

Kita harus mulai dengan untuk apa konsep layanan web dibuat. Pada saat konsep ini muncul, teknologi sudah ada di dunia yang memungkinkan aplikasi untuk berinteraksi dari jarak jauh, di mana satu program dapat memanggil beberapa metode di program lain, yang kemudian dapat diluncurkan di komputer yang terletak di kota atau bahkan negara lain. Semua ini disingkat RPC (Remote Procedure Calling - panggilan prosedur jarak jauh). Contohnya termasuk teknologi CORBA, dan untuk Java - RMI (Remote Method Invoking - remote method invocation). Dan semuanya tampak bagus di dalamnya, terutama di CORBA, karena Anda dapat bekerja dengannya dalam bahasa pemrograman apa pun, tetapi ada sesuatu yang masih hilang. Saya percaya bahwa kelemahan CORBA adalah ia bekerja melalui beberapa miliknya sendiri protokol jaringan alih-alih HTTP biasa, yang akan melewati firewall apa pun. Ide layanan web adalah untuk membuat RPC yang akan dimasukkan ke dalam paket HTTP. Maka dimulailah pengembangan standar. Apa konsep dasar dari standar ini:
  1. SABUN MANDI. Sebelum memanggil prosedur jarak jauh, Anda perlu menjelaskan panggilan ini di berkas XML format SOAP. SOAP hanyalah salah satu dari banyak markup XML yang digunakan dalam layanan web. Segala sesuatu yang ingin kita kirim ke suatu tempat melalui HTTP pertama-tama diubah menjadi deskripsi XML SOAP, kemudian dimasukkan ke dalam paket HTTP dan dikirim ke komputer lain di jaringan melalui TCP / IP.
  2. WSDL. Ada layanan web, mis. program yang metodenya dapat dipanggil dari jarak jauh. Tetapi standar mengharuskan deskripsi dilampirkan ke program ini, yang mengatakan bahwa "ya, Anda tidak salah - ini benar-benar layanan web dan Anda dapat memanggil metode ini dan itu darinya." Deskripsi ini diwakili oleh file XML lain yang memiliki format berbeda, yaitu WSDL. Itu. WSDL hanyalah file XML yang menggambarkan layanan web dan tidak ada yang lain.
Mengapa begitu pendek Anda bertanya? Tidak bisakah Anda menjelaskan lebih detail? Mungkin Anda bisa, tetapi untuk ini Anda harus beralih ke buku-buku seperti Mashnin T. "Java Web Services". Di sana untuk 200 halaman pertama pergi Detil Deskripsi setiap tag dari standar SOAP dan WSDL. Apakah itu layak? Menurut saya, tidak, karena semua ini dibuat secara otomatis di Java, dan Anda hanya perlu menulis konten metode yang seharusnya dipanggil dari jarak jauh. Jadi, di Jawa ada API seperti JAX-RPC. Jika ada yang tidak tahu kapan mereka mengatakan bahwa Java memiliki API ini dan itu, ini berarti ada paket dengan sekumpulan kelas yang merangkum teknologi yang bersangkutan. JAX-RPC berkembang dari versi ke versi untuk waktu yang lama dan akhirnya berkembang menjadi JAX-WS. WS jelas merupakan singkatan dari WebService dan Anda mungkin berpikir bahwa ini adalah penggantian nama sederhana dari RPC menjadi kata kunci yang populer akhir-akhir ini. Ini tidak begitu, karena sekarang layanan web telah menjauh dari ide asli dan memungkinkan tidak hanya memanggil metode jarak jauh, tetapi juga hanya mengirim pesan dokumen dalam format SOAP. Mengapa ini diperlukan, saya belum tahu, kecil kemungkinan jawabannya di sini adalah "berjaga-jaga, tiba-tiba dibutuhkan." Saya sendiri ingin belajar dari rekan-rekan yang lebih berpengalaman. Dan akhirnya, JAX-RS muncul untuk layanan web yang disebut RESTful, tetapi ini adalah topik untuk artikel terpisah. Pengenalan ini dapat diselesaikan, karena. selanjutnya kita akan belajar bagaimana bekerja dengan JAX-WS.

Pendekatan umum

Layanan web selalu memiliki klien dan server. Server adalah layanan web kami dan terkadang disebut titik akhir (seperti titik akhir tempat pesan SOAP dari jangkauan klien). Kita perlu melakukan hal berikut:
  1. Jelaskan antarmuka layanan web kami
  2. Terapkan antarmuka ini
  3. Mulai layanan web kami
  4. Tulis klien dan panggil metode layanan web yang diinginkan dari jarak jauh
Layanan web dapat diluncurkan cara yang berbeda: mendeskripsikan kelas dengan metode utama dan menjalankan layanan web secara langsung sebagai server, atau menyebarkannya ke server seperti Tomcat atau lainnya. Dalam kasus kedua, kami sendiri tidak meluncurkan server baru dan kami tidak membuka port lain di komputer, tetapi cukup beri tahu wadah servlet Tomcat bahwa "kami menulis kelas layanan web di sini, silakan publikasikan sehingga semua orang yang menghubungi Anda dapat menggunakan layanan web kami." Terlepas dari bagaimana layanan web diluncurkan, kami akan memiliki klien yang sama.

Server

Jalankan IDEA dan buat proyek baru Buat Proyek Baru. Tentukan nama layanan helloweb dan tekan tombol Lanjut, lalu tombol Menyelesaikan. dalam folder src membuat paket en.javarush.ws. Dalam paket ini, kami akan membuat antarmuka HelloWebService: paket ru. javarush. ws; // ini adalah anotasi, mis. cara untuk menandai kelas dan metode kita, // terkait dengan teknologi layanan web impor javax. jws. WebMetode; impor javax. jws. layanan web; impor javax. jws. sabun mandi. SOAPMengikat; // kami mengatakan bahwa antarmuka kami akan berfungsi sebagai layanan web@Layanan web // katakan bahwa layanan web akan digunakan untuk memanggil metode@SOAPBinding(style = SOAPBinding.Style.RPC) antarmuka publik HelloWebService( // katakan metode ini dapat dipanggil dari jarak jauh@WebMethod public String getHelloString(Nama string); ) Dalam kode ini, kelas WebService dan WebMethod disebut anotasi dan tidak melakukan apa pun selain menandai antarmuka dan metodenya sebagai layanan web. Hal yang sama berlaku untuk kelas SOAPBinding. Satu-satunya perbedaan adalah bahwa SOAPBinding adalah anotasi dengan parameter. DI DALAM kasus ini parameter gaya digunakan dengan nilai yang menunjukkan bahwa layanan web tidak akan berfungsi melalui pesan dokumen, tetapi sebagai RPC klasik, mis. untuk memanggil metode. Mari kita implementasikan logika antarmuka kita dan buat kelas HelloWebServiceImpl di package.json kita. Omong-omong, saya perhatikan bahwa kelas yang diakhiri dengan Impl adalah konvensi di Jawa, yang menurutnya implementasi antarmuka ditunjuk (Impl - dari kata implementasi, yaitu implementasi). Ini bukan persyaratan dan Anda bebas memberi nama kelas apa pun yang Anda inginkan, tetapi tata krama membutuhkannya: package ru. javarush. ws; // anotasi yang sama seperti untuk deskripsi antarmuka, impor javax. jws. layanan web; // tapi di sini digunakan dengan parameter endpointInterface, // menunjukkan nama lengkap kelas antarmuka layanan web kami@WebService(endpointInterface= "en.javarush.ws.HelloWebService") kelas publik HelloWebServiceImpl mengimplementasikan HelloWebService ( @Override public String getHelloString (Nama string) ( // balas saja salamnya kembali "Halo, " + nama + "!" ; ) ) Mari kita jalankan layanan web kita sebagai server mandiri, mis. tanpa partisipasi Tomcat dan server aplikasi apa pun (ini adalah topik untuk diskusi terpisah). Untuk melakukan ini, dalam struktur proyek di folder src mari kita buat paket ru.javarush.endpoint , dan di dalamnya kita akan membuat kelas HelloWebServicePublisher dengan metode main: package ru. javarush. titik akhir; // kelas untuk memulai server web dengan layanan web impor javax. xml. ws. titik akhir; // kelas layanan web kami impor id. javarush. ws. hellowebserviceimpl; kelas publik HelloWebServicePublisher( public static void main(String. . . args)( // memulai server web pada port 1986 // dan pada alamat yang ditentukan dalam argumen pertama, // memulai layanan web yang diteruskan dalam argumen kedua titik akhir. menerbitkan( "http://localhost:1986/wss/halo", HelloWebServiceImpl baru ( ) ) ; ) ) Sekarang jalankan kelas ini dengan mengklik Shift + F10. Tidak ada yang akan muncul di konsol, tetapi server sedang berjalan. Anda dapat memverifikasi ini dengan mengetikkan http://localhost:1986/wss/hello?wsdl di browser Anda. Halaman yang dibuka, di satu sisi, membuktikan bahwa kami memiliki server web (http://) yang berjalan pada port 1986 di komputer kami (localhost), dan, di sisi lain, menunjukkan deskripsi WSDL dari layanan web kami. Jika Anda menghentikan aplikasi, maka deskripsi akan menjadi tidak dapat diakses, serta layanan web itu sendiri, jadi kami tidak akan melakukan ini, tetapi beralih ke menulis klien.

Pelanggan

Di folder proyek src mari kita buat paket ru.javarush.client , dan di dalamnya kelas HelloWebServiceClient dengan metode utama: paket ru. javarush. klien; // diperlukan untuk mendapatkan deskripsi wsdl dan melaluinya // mencapai layanan web itu sendiri impor jawa. bersih. URL; // pengecualian seperti itu akan terjadi saat bekerja dengan objek URL impor jawa. bersih. MalformedURLException; // kelas untuk mengurai xml dengan deskripsi wsdl // dan raih tag layanan di dalamnya impor javax. xml. ruang nama. Qnama; impor javax. xml. ws. melayani; // antarmuka layanan web kami (kami membutuhkan lebih banyak) impor id. javarush. ws. haloweblayanan; kelas publik HelloWebServiceClient( public static void main(String args) melempar MalformedURLException( // buat tautan ke deskripsi wsdl url= url baru ( "http://localhost:1986/wss/hello?wsdl") ; // Kami melihat parameter konstruktor berikutnya di tag deskripsi WSDL pertama - definisi // lihat argumen pertama di atribut targetNamespace // Argumen ke-2 lihat di atribut nama QName qname = new QName ("http://ws.site/", "HelloWebServiceImplService"); // Sekarang kita dapat mencapai tag layanan dalam deskripsi wsdl, Layanan layanan= layanan. buat (url, qname); // dan kemudian ke tag port yang bersarang di dalamnya, sehingga // dapatkan referensi ke objek layanan web yang jauh dari kami HelloWebService halo = layanan. getPort(HelloWebService.class); // Hore! Sekarang Anda dapat memanggil metode jarak jauh Sistem. keluar. println(halo.getHelloString("JavaRush" ) ); ) ) Saya memberikan komentar maksimal pada kode dalam daftar. Saya tidak punya apa-apa untuk ditambahkan, jadi jalankan (Shift + F10). Kita akan melihat teks di konsol: Halo, JavaRush! Jika Anda tidak melihatnya, maka Anda mungkin lupa memulai layanan web.

Kesimpulan

Dalam topik ini, tamasya singkat ke layanan web disajikan. Sekali lagi, banyak dari apa yang saya tulis adalah tebakan saya tentang cara kerjanya, dan karena itu saya tidak boleh terlalu dipercaya. Saya akan berterima kasih jika orang yang berpengetahuan Saya akan dikoreksi, karena dengan begitu saya akan belajar sesuatu. UPD.

Alexey Boyko

Layanan Web SOAP dan XML di .Net

Layanan web XML menawarkan tingkat interoperabilitas dan interoperabilitas sehubungan dengan sistem operasi,

platform dan bahasa yang sebelumnya tidak tersedia.

Andrew Troelsen (Profesional Paling Berharga di Microsoft MVP)

Jika Anda belum pernah bekerja dengan XML Web Services, Anda mungkin pernah mendengar kata "SOAP". Saatnya untuk menangani konsep-konsep ini.

pengantar

Jika Anda tertarik dengan Internet atau jaringan yang lebih kecil, kemungkinan besar Anda akan menemukan layanan web XML cepat atau lambat. Layanan web XML lebih dari sekadar aplikasi web yang mampu menampilkan informasi ke browser. Sebaliknya, ini adalah teknologi jarak jauh yang memungkinkan Anda memanggil metode dan properti objek di jaringan menggunakan permintaan HTTP standar.

Dalam praktiknya, ini berarti bahwa klien dari layanan semacam itu dapat ditulis dalam bahasa yang berbeda dan untuk sistem operasi yang berbeda.

Sebagai "transportasi" informasi antara layanan dan klien, Anda dapat menggunakan metode GET atau POST HTTP.

Dan Anda dapat "memaksakan" protokol lain di atas - SOAP (Simple Object Access Protocol). Ini biasanya dilakukan, karena dalam hal ini dimungkinkan untuk melewatkan tipe kompleks (termasuk yang ditentukan pengguna). Dan metode GET dan POST klasik hanya mendukung daftar, array sederhana, dan string.

Contoh komunikasi SOAP

Pesan SOAP adalah dokumen XML yang ditempatkan di badan permintaan HTTP.

Daftar 1. Struktur pesan SOAP

Interaksi antara klien dan layanan adalah sebagai berikut:

  • klien membentuk permintaan SOAP dan mengirimkannya ke layanan;
  • layanan aktif komputer remot mengeksekusi prosedur dan mengirimkan respon SOAP.

Misalnya, permintaan SOAP yang memanggil metode HelloWorld() dari layanan web XML jarak jauh mungkin terlihat seperti ini:

Daftar 2. Contoh permintaan SOAP

Metode HelloWorld(), seperti yang diharapkan, mengembalikan string "Hello world!":

Daftar 3. Contoh tanggapan SOAP

Xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Halo Dunia!

Membuat Layanan Web XML di .NET 2.0

Anda dapat membuat layanan cara yang berbeda, kita akan menggunakan Visual Studio 2005. Klik "File -> New -> Web Site", di jendela yang terbuka, pilih "ASP.NET web Service". Pada alamat yang ditentukan selama pembuatan, Anda akan menemukan file dan direktori berikut (lihat Gambar 1).

Pada prinsipnya, sebuah layanan hanya dapat berisi satu file *.asmx tunggal. (Ekstensi *.asmx digunakan untuk menunjukkan layanan web .Net.) Dalam kasus ini, ini tidak terjadi, lihat konten file Service.asmx:

Daftar 4. Service.asmx mendefinisikan file eksternal mendukung

<%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" class="Service" %>

Atribut CodeBehind menentukan file eksternal yang terletak di folder App_Code yang berisi kode program yang mengimplementasikan metode HelloWorld():

Daftar 5. File Service.cs yang mengimplementasikan metode HelloWorld()

menggunakan Sistem;

menggunakan System.Web;

menggunakan System.Web.Services;

pelayanan publik ()

Kembalikan "Halo Dunia";

Dimungkinkan untuk membuat satu file Service.asmx tanpa kode dukungan yang memiliki fungsi yang sama:

Listing 6. Service.asmx tanpa kode dukungan eksternal

<%@ WebService Language="C#" class="Service" %>

menggunakan Sistem;

menggunakan System.Web;

menggunakan System.Web.Services;

menggunakan System.Web.Services.Protocols;

Layanan kelas publik: System.Web.Services.WebService

pelayanan publik ()

String publik HelloWorld() (

Kembalikan "Halo Dunia";

Kami tidak membutuhkannya, dan kami tidak akan melakukannya.

Seperti yang Anda lihat, metode tunggal layanan web kami ditandai dengan atribut yang menginformasikan runtime ASP.NET bahwa metode ini tersedia untuk permintaan HTTP yang masuk. Anggota yang tidak ditandai dengan atribut ini tidak akan tersedia untuk program klien.

Layanan sederhana seperti itu sangat cocok untuk eksperimen kami, tetap hanya untuk mempublikasikannya.

Menerbitkan Layanan Web XML Menggunakan IIS

Ini bukan tentang penerbitan di Internet, tetapi tentang menciptakan kondisi untuk menguji layanan kami di komputer lokal.

Pertama, instal IIS (Internet Information Server). Untuk melakukan ini, buka jendela "Tambah atau Hapus Program" dan pilih "Instal Komponen Windows". (Beberapa Versi Windows tidak memerlukan IIS untuk diinstal, seperti Windows XP Home Edition.)

Catatan: server IIS lebih baik menginstal lebih awal daripada .Net Framework, jika tidak, Anda harus mengonfigurasi IIS untuk mendukung aplikasi .Net dengan menjalankan utilitas garis komando aspnet_regiis.exe (dengan flag /i).

Buat direktori virtual. Jika Anda menggunakan Windows XP Pro, buka "Panel Kontrol -> Alat Administratif -> Layanan Informasi Internet". Di jendela yang terbuka, pilih "Aksi -> Buat -> Direktori Virtual".

Wizard Pembuatan Direktori Virtual akan dimulai. Tentukan Soap1 sebagai alias dan atur jalur ke direktori tempat Anda ingin menempatkan layanan, misalnya C:\Soap1. Sekarang salin konten layanan web kami di sana.

Ketik http://localhost/soap1/Service.asmx di bilah alamat browser Anda dan Anda akan melihat halaman pengujian layanan (lihat Gambar 2).

Melihat Pesan SOAP

Halaman pengujian tidak mengizinkan pengiriman dan pembacaan pesan SOAP. Untuk alasan ini, Anda harus menggunakan pengembangan pihak ketiga, saya sarankan menggunakan soapUI. (Ini adalah produk gratis yang tersedia di http://www.soapui.org.)

Setelah soapUI diinstal, buat proyek baru bernama soap1, biarkan bidang WSDL Initial kosong (lihat Gambar 3).

Klik kanan pada proyek yang baru dibuat dan pilih "Tambahkan WSDL dari URL". Di kotak dialog yang terbuka, masukkan http://localhost/soap1/Service.asmx?wsdl. Kami sekarang memiliki kemampuan untuk mengirim permintaan SOAP ke layanan kami dan melihat tanggapan yang diterima. (Permintaan akan dibuat secara otomatis oleh soapUI.)

Apa ini WSDL? Dokumen WSDL menjelaskan bagaimana klien dapat berinteraksi dengan layanan web. Ini menjelaskan metode layanan mana yang tersedia untuk panggilan eksternal, parameter apa yang mereka ambil dan apa yang mereka kembalikan, serta informasi lain yang diperlukan untuk remote. Dokumen semacam itu dapat dikompilasi secara manual, atau Anda dapat mempercayakan pembuatannya ke server, untuk ini cukup menambahkan akhiran ?wsdl ke URL yang menunjuk ke file *.asmx.

Untuk melihat dokumen WSDL untuk layanan kami, masukkan http://localhost/soap1/Service.asmx?wsdl di browser Anda. Informasi dari dokumen ini digunakan oleh soapUI untuk menghasilkan permintaan SOAP secara otomatis.

Ekstensi SOAP

Seperti yang mungkin telah Anda perhatikan, untuk membuat layanan web XML (seperti klien), Anda tidak perlu khawatir tentang bentuk pesan SOAP. Cukup dengan menandai metode yang diinginkan dengan atribut, dan runtime ASP.NET akan dengan sendirinya membuat paket dengan format yang diinginkan.

pada gambar. Gambar 4 menunjukkan permintaan layanan web dan respons yang diterima menggunakan program soapUI.

Mari kita ulangi lagi. Permintaan dibuat oleh soapUI - saat membuat klien nyata untuk layanan, Anda juga tidak perlu memformat paket SOAP secara manual. Kami juga tidak secara langsung berpartisipasi dalam pembuatan respon layanan. Semua ini terjadi secara otomatis.

Namun, sepertinya Anda perlu memodifikasi sendiri paket-paket ini. Misalnya, untuk mengompresi atau mengenkripsi data yang dikirimkan. Ini adalah tujuan dari SOAP Extensions.

Ekstensi SOAP adalah mekanisme yang memungkinkan Anda untuk mengubah pesan SOAP yang diterima dan dikirim secara sewenang-wenang.

Jalur pesan SOAP

Untuk memulai pemrograman, kita perlu mempertimbangkan jalur yang diambil pesan SOAP sebelum diterima dan diproses dengan metode yang sesuai (lihat Gambar 5).

Pesan SOAP dapat dianggap sebagai dokumen XML yang menjelaskan objek yang dikirimkan melalui jaringan. Sebelum objek yang diteruskan dengan cara ini dapat digunakan, objek tersebut harus dipulihkan (atau, jika Anda lebih suka, dirakit) dari deskripsi ini. Sebuah serializer XML melayani tujuan ini.

Paket yang masuk dideserialisasi (memulihkan objek dari deskripsi XML), dan paket yang dikirim diserialisasi (membuat deskripsi XML objek).

pada gambar. Gambar 5 menunjukkan empat titik (BeforeSerialize, AfterDeserialize, BeforeDeserialize, AfterSerialize) di mana kita dapat mencegat pesan SOAP menggunakan SOAP Extensions. Ubah dan kirimkan.

Implementasi Ekstensi SOAP

Pertama, mari kita definisikan tugasnya: katakanlah kita ingin mengubah paket SOAP yang dikirim oleh layanan web seperti yang ditunjukkan pada Listing 7:

Daftar 7. Respons layanan web XML "Lama" dan baru

Xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Halo Dunia

Xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

cipherteks

Rencana aksi untuk implementasi SOAP Extension:

  • Kami membuat dll dengan kelas yang mewarisi dari SoapExtension.
  • Kami menambahkan folder bin ke layanan web kami dan meletakkan dll yang dibuat di sana.
  • Tambahkan file web.config ke layanan dan buat perubahan yang diperlukan padanya.

Peran folder bin dan file web.config akan dibahas nanti.

Membuat DLL dengan Ekstensi SOAP

Buat proyek "Perpustakaan Kelas" baru bernama SoapExtensionLib. Proyek ini hanya perlu mengimplementasikan satu kelas yang akan melakukan modifikasi pada paket SOAP yang kita butuhkan. Kelas ini harus diturunkan dari kelas SoapExtension.

Listing 8. Membuat kelas yang diwarisi dari SoapExtension

menggunakan Sistem;

menggunakan System.Web.Services;

menggunakan System.Web.Services.Protocols;

menggunakan System.IO;

menggunakan System.Net;

menggunakan System.Xml;

Setiap Ekstensi SOAP menerima sebagai parameter aliran yang berisi objek yang ditransmisikan melalui jaringan (sebelum atau setelah serialisasi). Dan harus mengembalikan aliran.

Ekstensi SOAP dapat dianggap sebagai "bilah sisi" yang dapat ditempatkan pada satu atau semua dari empat titik (BeforeSerialize, AfterDeserialize, BeforeDeserialize, AfterSerialize) yang ditunjukkan pada Gambar 2. 5. Bisa ada sejumlah "sisipan" seperti itu di setiap titik (lihat Gbr. 6).

Untuk mendapatkan aliran ini, gunakan metode ChainStream.

Daftar 9. Implementasi metode ChainStream

TraceExtension kelas publik: SoapExtension

Streaming wireStream;

Streaming aplikasiStream;

// metode sebagai parameter input

// mendapatkan aliran yang berisi objek yang diteruskan

Pengabaian publik Stream ChainStream (Aliran aliran)

WireStream = aliran;

AppStream = MemoryStream baru();

kembali appStream;

Pada titik BeforeDeserialize, wireStream berisi permintaan SOAP yang diterima dari jaringan. Permintaan SOAP ini harus diteruskan ke aliran aplikasi (aliran appStream).

Dan pada titik AfterSerialize, Anda harus meneruskan ke wireStream respons SOAP yang dikirim ke jaringan, yang akan ditempatkan di appStream.

Untuk bekerja dengan utas di masing-masing dari empat titik, Anda perlu menerapkan metode ProcessMessage.

Daftar 10. Implementasi metode ProcessMessage yang tidak mengubah pesan SOAP

// ProcessMessage yang melakukan salinan wajib

// streaming di dua titik (BeforeDeserialize dan AfterSerialize)

Beralih (pesan. Panggung)

// pada titik SebelumDeserialize harus dilewati

// Permintaan SOAP dari aliran jaringan (wireStream)

// ke aliran aplikasi (appStream)

Case SoapMessageStage.BeforeDeserialize:

Salin (wireStream, appStream);

AppStream.Position = 0;

merusak;

// pada titik AfterSerialize harus dilewati

// Respons SOAP dari utas aplikasi ke utas jaringan

AppStream.Position = 0;

merusak;

void Salin (Aliran dari, Aliran ke)

Pembaca TextReader = StreamReader baru (dari);

Penulis TextWriter = new StreamWriter(ke);

Writer.WriteLine(pembaca.ReadToEnd());

Penulis.Flush();

Daftar 10 dapat diambil sebagai kosong untuk percobaan lebih lanjut. Implementasi metode ProcessMessage ini tidak masuk akal - respons SOAP keluar tidak dimodifikasi dengan cara apa pun. Mari kita perbaiki ini:

Daftar 11. Implementasi metode ProcessMessage yang mengubah respons SOAP

pembatalan publik ProcessMessage (pesan SoapMessage)

Beralih (pesan. Panggung)

Case SoapMessageStage.AfterSerialize:

WriteOutput(pesan);

merusak;

// bagian dari potongan kode untuk menghemat ruang

// tulis ulang respons SOAP

public void WriteOutput (pesan SoapMessage)

AppStream.Position = 0;

// buat dokumen XML dari aliran

Dokumen XmlDocument = new XmlDocument();

Document.Load(appStream);

// Untuk menggunakan XPath, Anda perlu mendefinisikan

// Manajer ruang nama

XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);

Nsmgr.AddNamespace("sabun", "http://schemas.xmlsoap.org/soap/envelope/");

XmlNode ResultNode = document.SelectSingleNode("//soap:Body", nsmgr);

// ganti isi node

ResultNode.InnerText = "ciphertext";

// hapus aliran dan tulis respons SOAP baru untuk itu

AppStream.SetLength(0);

AppStream.Position = 0;

Dokumen.Simpan (appStream);

// TINDAKAN YANG DIPERLUKAN

// meneruskan respons SOAP dari aliran aplikasi (appStream)

// ke aliran jaringan (wireStream)

AppStream.Position = 0;

Salin (appStream, wireStream);

Selanjutnya, kita perlu mendefinisikan dua metode (salah satunya kelebihan beban, yaitu, dapat dipanggil dengan set parameter yang berbeda), yang tidak diperlukan dalam kasus kita. Namun, kita harus mendefinisikannya sesuai dengan aturan pewarisan dari kelas SoapExtension.

Daftar 12. Metode wajib lainnya

// Sesuai dengan aturan pewarisan, kita harus

// mendefinisikan metode ini, tetapi kami tidak menggunakannya dengan cara apa pun

objek menimpa publik?

GetInitializer(LogicalMethodInfo methodInfo, atribut SoapExtensionAttribute)

kembali nol;

objek override publik GetInitializer (Jenis WebServiceType)

kembali nol;

public override void Inisialisasi (penginisialisasi objek)

kembali;

Semuanya, kami menyusun proyek. Kami akhirnya mendapatkan SOAP Extension dll. Daftar lengkap SoapExtensionLib.dll tersedia di situs web jurnal di bagian Kode Sumber.

Mengonfigurasi layanan web agar berfungsi dengan SOAP Extension

Buka proyek Layanan Web XML kami lagi dengan Visual Studio. Klik "WebSite -> Add Reference" dan pilih SoapExtensionLib.dll yang Anda buat sebelumnya.

Folder Bin akan secara otomatis ditambahkan ke proyek. File *.dll yang terletak di folder Bin secara otomatis direferensikan oleh aplikasi.

Sekarang letakkan file Web.Config di direktori layanan web dengan konten berikut:

Daftar 13. File Web.Config

Prioritas="1"

Grup="0" />

Sekarang struktur layanan kami terlihat seperti yang ditunjukkan pada Gambar. 7.

Menggunakan file Web.Config, kami menginformasikan lingkungan ASP.NET yang telah kami tambahkan ke layanan web XML Soap Extension, yang diimplementasikan di kelas TraceExtension yang terletak di file SoapExtensionLi.dll.

Listing 14. Bagian webServices di file Web.Config

Prioritas="1"

Grup="0" />

Seperti yang sudah Anda ketahui, Anda dapat membuat beberapa Ekstensi SOAP, dan aliran yang membawa objek yang diteruskan (sebelum atau setelah serialisasi) akan melewati masing-masing ekstensi tersebut. Urutan aliran melintasi berbagai Ekstensi SOAP ditentukan menggunakan atribut prioritas dan grup.

Perlu dicatat bahwa dengan mengkonfigurasi Web.Config dengan cara ini, kami memberi tahu lingkungan bahwa Ekstensi SOAP kami akan dipanggil untuk setiap metode layanan yang ditandai dengan atribut. Dimungkinkan untuk membuat atribut Anda sendiri dan menandai dengannya hanya metode-metode yang Anda perlukan untuk memanggil Ekstensi SOAP.

Daftar 15. Contoh atribut khusus

string publik HelloWorld() (

Kembalikan "Halo Dunia";

Untuk melakukannya, tambahkan kelas yang diwarisi dari SoapExtensionAttribute ke SoapExtensionLi.dll (lihat Gambar 8).

Kesimpulan

Artikel ini mencerminkan poin utama dalam membangun dan memfungsikan layanan web XML pada platform .Net. Saya berharap materi yang disampaikan cukup banyak sehingga bila perlu dapat melakukan kajian topik yang lebih mendalam.


dalam kontak dengan