Saya mencoba memecahkan masalah klien layanan web dalam proyek saya saat ini. Saya tidak yakin dengan platform Server Layanan (Kemungkinan besar LAMP). Saya yakin ada kesalahan di pihak mereka karena saya telah menghilangkan potensi masalah dengan klien saya. Klien adalah proxy referensi web jenis ASMX standar yang dibuat secara otomatis dari layanan WSDL.
Yang perlu saya dapatkan adalah Pesan SOAP RAW (Permintaan dan Tanggapan)
Apa cara terbaik untuk masalah ini?
Anda dapat menerapkan SoapExtension yang mencatat permintaan dan respons lengkap ke file log. Anda kemudian dapat mengaktifkan SoapExtension di web.config, yang memudahkan untuk mengaktifkan / menonaktifkan untuk tujuan debugging. Berikut adalah contoh yang telah saya temukan dan modifikasi untuk saya gunakan sendiri, dalam kasus saya logging dilakukan oleh log4net tetapi Anda dapat mengganti metode log dengan milik Anda sendiri.
Anda kemudian menambahkan bagian berikut ke web.config Anda di mana YourNamespace dan YourAssembly menunjuk ke kelas dan perakitan SoapExtension Anda:
sumber
Tidak yakin mengapa semua repot dengan web.config atau kelas serializer. Kode di bawah ini berfungsi untuk saya:
sumber
myEnvelope
asalnyaCoba Fiddler2 ini akan membiarkan Anda memeriksa permintaan dan respon. Perlu dicatat bahwa Fiddler bekerja dengan lalu lintas http dan https.
sumber
Sepertinya solusi Tim Carter tidak berfungsi jika panggilan ke referensi web melontarkan pengecualian. Saya telah mencoba untuk mendapatkan jawaban web mentah sehingga saya dapat memeriksanya (dalam kode) di penangan kesalahan setelah pengecualian dilemparkan. Namun, saya menemukan bahwa log respons yang ditulis oleh metode Tim kosong saat panggilan melontarkan pengecualian. Saya tidak sepenuhnya memahami kodenya, tetapi tampaknya metode Tim memotong proses setelah titik di mana .Net telah membatalkan dan membuang respons web.
Saya bekerja dengan klien yang mengembangkan layanan web secara manual dengan pengkodean tingkat rendah. Pada titik ini, mereka menambahkan pesan kesalahan proses internal mereka sendiri sebagai pesan berformat HTML ke dalam tanggapan SEBELUM tanggapan yang diformat SOAP. Tentu saja, referensi web .Net automagic meledak dalam hal ini. Jika saya bisa mendapatkan respons HTTP mentah setelah pengecualian dilemparkan, saya dapat mencari dan mengurai respons SOAP apa pun dalam respons HTTP campuran yang kembali dan tahu bahwa mereka menerima data saya dengan baik atau tidak.
Nanti ...
Berikut adalah solusi yang berhasil, bahkan setelah eksekusi (perhatikan bahwa saya hanya setelah respons - bisa mendapatkan permintaan juga):
Berikut cara Anda mengkonfigurasinya di file konfigurasi:
"TestCallWebService" harus diganti dengan nama pustaka (yang kebetulan adalah nama aplikasi konsol pengujian yang saya gunakan).
Anda benar-benar tidak harus pergi ke ChainStream; Anda seharusnya dapat melakukannya dengan lebih mudah dari ProcessMessage sebagai:
Jika Anda mencari SoapMessage.Stream, ini seharusnya menjadi aliran hanya-baca yang dapat Anda gunakan untuk memeriksa data pada saat ini. Ini adalah penyebab yang kacau jika Anda membaca aliran, pemrosesan selanjutnya membom tanpa kesalahan data yang ditemukan (aliran berada di akhir) dan Anda tidak dapat mengatur ulang posisi ke awal.
Menariknya, jika Anda melakukan kedua metode, cara ChainStream dan ProcessMessage, metode ProcessMessage akan berfungsi karena Anda mengubah jenis aliran dari ConnectStream ke MemoryStream di ChainStream, dan MemoryStream mengizinkan operasi pencarian. (Saya mencoba mentransmisikan ConnectStream ke MemoryStream - tidak diizinkan.)
Jadi ..... Microsoft harus mengizinkan operasi pencarian pada tipe ChainStream atau membuat SoapMessage.Stream benar-benar salinan hanya-baca sebagaimana mestinya. (Tulis anggota kongres Anda, dll ...)
Satu hal lagi. Setelah membuat cara untuk mengambil respons HTTP mentah setelah pengecualian, saya masih belum mendapatkan respons penuh (seperti yang ditentukan oleh sniffer HTTP). Ini karena ketika layanan web pengembangan menambahkan pesan kesalahan HTML ke awal respons, itu tidak menyesuaikan header Panjang Konten, sehingga nilai Panjang Konten kurang dari ukuran isi respons yang sebenarnya. Yang saya dapatkan hanyalah jumlah karakter nilai Panjang Konten - sisanya hilang. Jelas, ketika .Net membaca aliran respons, itu hanya membaca jumlah karakter Panjang Konten dan tidak memungkinkan nilai Panjang Konten mungkin salah. Ini sebagaimana mestinya; tetapi jika nilai header Panjang Konten salah, satu-satunya cara Anda akan mendapatkan seluruh isi respons adalah dengan sniffer HTTP (Saya pengguna HTTP Analyzer darihttp://www.ieinspector.com ).
sumber
Saya lebih suka memiliki kerangka kerja yang melakukan pencatatan untuk Anda dengan menghubungkan aliran pencatatan yang mencatat sebagai kerangka proses yang mendasari aliran. Berikut ini tidak sebersih yang saya inginkan, karena Anda tidak dapat memutuskan antara permintaan dan tanggapan dalam metode ChainStream. Berikut cara saya menanganinya. Terima kasih kepada Jon Hanna untuk ide streaming yang utama
sumber
Berikut adalah versi sederhana dari jawaban teratas. Tambahkan ini ke
<configuration>
elemen fileweb.config
atau AndaApp.config
. Ini akan membuattrace.log
file dibin/Debug
folder proyek Anda . Atau, Anda dapat menentukan jalur absolut untuk file log menggunakaninitializeData
atribut.Ini memperingatkan bahwa atribut
maxdatasize
dantracemode
tidak diperbolehkan, tetapi mereka meningkatkan jumlah data yang dapat dicatat, dan menghindari pencatatan semuanya dalam hex.sumber
Anda belum menentukan bahasa apa yang Anda gunakan tetapi dengan asumsi C # / .NET Anda dapat menggunakan ekstensi SOAP .
Jika tidak, gunakan sniffer seperti Wireshark
sumber
Saya menyadari saya cukup terlambat ke pesta, dan karena bahasa tidak benar-benar ditentukan, berikut adalah solusi VB.NET berdasarkan jawaban Bimmerbound, jika ada yang kebetulan menemukan ini dan membutuhkan solusi. Catatan: Anda perlu memiliki referensi ke kelas stringbuilder dalam proyek Anda, jika Anda belum memilikinya.
Cukup panggil fungsinya dan itu akan mengembalikan string dengan serialisasi xml dari objek yang Anda coba kirimkan ke layanan web (secara realistis, ini harus bekerja untuk objek apa pun yang ingin Anda lemparkan juga).
Sebagai catatan tambahan, panggilan replace dalam fungsi sebelum mengembalikan xml adalah untuk menghapus karakter vbCrLf dari output. Milik saya memiliki banyak dari mereka dalam xml yang dihasilkan tetapi ini jelas akan bervariasi tergantung pada apa yang Anda coba untuk serialisasi, dan saya pikir mereka mungkin dilucuti selama objek dikirim ke layanan web.
sumber