Kami memiliki persyaratan untuk mengambil pengiriman formulir dan menyimpan beberapa data, kemudian mengarahkan pengguna ke halaman di luar kantor, tetapi dalam mengarahkan ulang, kita perlu "mengirimkan" formulir dengan POST, bukan GET.
Saya berharap ada cara mudah untuk mencapai ini, tetapi saya mulai berpikir tidak ada. Saya pikir saya sekarang harus membuat halaman lain yang sederhana, hanya dengan bentuk yang saya inginkan, redirect ke sana, isi variabel formulir, kemudian lakukan pemanggilan body.onload ke skrip yang hanya memanggil document.forms [0] .submit ( );
Adakah yang bisa memberi tahu saya jika ada alternatif? Kita mungkin perlu men-tweak ini nanti dalam proyek, dan mungkin agak rumit, jadi jika ada yang mudah kita bisa melakukan ini semua tergantung halaman lain yang akan fantastis.
Bagaimanapun, terima kasih atas semua dan semua tanggapan.
sumber
Jawaban:
Melakukan hal ini membutuhkan pemahaman tentang cara pengalihan HTTP bekerja. Saat Anda menggunakan
Response.Redirect()
, Anda mengirim respons (ke browser yang mengajukan permintaan) dengan HTTP Status Code 302 , yang memberi tahu browser tempat yang harus dikunjungi selanjutnya. Menurut definisi, browser akan membuatnya melaluiGET
permintaan, bahkan jika permintaan asli adalah aPOST
.Pilihan lain adalah menggunakan HTTP Status Code 307 , yang menentukan bahwa browser harus membuat permintaan pengalihan dengan cara yang sama seperti permintaan asli, tetapi untuk meminta pengguna dengan peringatan keamanan. Untuk melakukan itu, Anda akan menulis sesuatu seperti ini:
Sayangnya, ini tidak akan selalu berhasil. Browser yang berbeda menerapkan ini secara berbeda , karena ini bukan kode status yang umum.
Jadi, sejauh yang saya tahu, satu-satunya cara untuk mengimplementasikan sesuatu seperti ini adalah dengan menggunakan Javascript. Ada dua opsi yang bisa saya pikirkan di atas kepala saya:
action
titik atributnya ke server pihak ketiga. Kemudian, tambahkan acara klik ke tombol kirim yang pertama kali mengeksekusi permintaan AJAX ke server Anda dengan data, dan kemudian memungkinkan formulir untuk dikirimkan ke server pihak ketiga.Dari keduanya, saya akan memilih yang kedua, karena dua alasan. Pertama, ini lebih dapat diandalkan daripada yang pertama karena Javascript tidak diperlukan untuk itu berfungsi; bagi mereka yang tidak mengaktifkannya, Anda selalu dapat membuat tombol kirim untuk formulir tersembunyi terlihat, dan memerintahkan mereka untuk menekannya jika perlu lebih dari 5 detik. Kedua, Anda dapat memutuskan data apa yang dikirimkan ke server pihak ketiga; jika Anda hanya menggunakan formulir saat berjalan, Anda akan melewati semua data pos, yang tidak selalu seperti yang Anda inginkan. Sama untuk solusi 307, dengan asumsi itu bekerja untuk semua pengguna Anda.
Semoga ini membantu!
sumber
Anda dapat menggunakan pendekatan ini:
Sebagai hasil tepat setelah klien akan mendapatkan semua html dari server, acara onload terjadi yang memicu formulir kirim dan kirim semua data ke postbackUrl yang ditentukan.
sumber
HttpWebRequest digunakan untuk ini.
Pada postback, buat HttpWebRequest ke pihak ketiga Anda dan posting formulir data, maka setelah selesai, Anda bisa Response.Redirect di mana pun Anda inginkan.
Anda mendapatkan keuntungan tambahan bahwa Anda tidak harus memberi nama semua kontrol server Anda untuk membuat formulir pihak ke-3, Anda dapat melakukan terjemahan ini saat membuat string POST.
Namun, jika Anda memerlukan pengguna untuk melihat halaman respons dari formulir ini, satu-satunya pilihan Anda adalah menggunakan Server.Transfer, dan itu mungkin atau mungkin tidak berfungsi.
sumber
Ini seharusnya membuat hidup lebih mudah. Anda cukup menggunakan metode Response.RedirectWithData (...) di aplikasi web Anda dengan mudah.
sumber
Sesuatu yang baru di ASP.Net 3.5 adalah properti "PostBackUrl" ini dari tombol ASP. Anda dapat mengaturnya ke alamat halaman yang ingin Anda kirimi secara langsung, dan ketika tombol itu diklik, alih-alih mengirim kembali ke halaman yang sama seperti biasa, itu malah memposting ke halaman yang telah Anda indikasikan. Berguna. Pastikan UseSubmitBehavior juga disetel ke TRUE.
sumber
Mungkin menarik untuk berbagi bahwa heroku melakukan ini dengan SSO untuk penyedia Add-on-nya
Contoh cara kerjanya dapat dilihat pada sumber ke alat "kensa":
https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb
Dan bisa dilihat dalam prakteknya jika Anda mengaktifkan javascript. Sumber halaman contoh:
sumber
PostbackUrl dapat diatur pada tombol asp Anda untuk mengirim ke halaman lain.
jika Anda perlu melakukannya di codebehind, coba Server.Transfer.
sumber
@ Mat,
Anda masih dapat menggunakan HttpWebRequest, lalu mengarahkan respons yang Anda terima ke respons outputstream aktual, ini akan melayani respons kembali ke pengguna. Satu-satunya masalah adalah bahwa setiap url relatif akan rusak.
Namun, itu mungkin berhasil.
sumber
Inilah yang akan saya lakukan:
Letakkan data dalam bentuk standar (tanpa atribut runat = "server") dan atur aksi formulir untuk dikirim ke halaman target di luar situs. Sebelum mengirimkan saya akan mengirimkan data ke server saya menggunakan XmlHttpRequest dan menganalisis responsnya. Jika jawabannya berarti Anda harus melanjutkan POSTING di luar kantor, maka saya (JavaScript) akan melanjutkan dengan posting tersebut jika tidak saya akan mengarahkan ulang ke halaman di situs saya.
sumber
Ya, HttpWebRequest, lihat posting saya di bawah ini.
sumber
Metode GET (dan HEAD) tidak boleh digunakan untuk melakukan apa pun yang memiliki efek samping. Efek samping mungkin memperbarui status aplikasi web, atau mungkin mengisi daya kartu kredit Anda. Jika suatu tindakan memiliki efek samping, metode lain (POST) harus digunakan sebagai gantinya.
Jadi, pengguna (atau browser mereka) tidak seharusnya dimintai pertanggungjawaban atas sesuatu yang dilakukan oleh GET. Jika beberapa efek samping yang berbahaya atau mahal terjadi sebagai akibat dari GET, itu akan menjadi kesalahan aplikasi web, bukan pengguna. Menurut spesifikasi, agen pengguna tidak boleh secara otomatis mengikuti arahan ulang kecuali itu adalah respons terhadap permintaan GET atau HEAD.
Tentu saja, banyak permintaan GET memiliki beberapa efek samping, bahkan jika itu hanya ditambahkan ke file log. Yang penting adalah bahwa aplikasi, bukan pengguna, harus bertanggung jawab atas efek tersebut.
Bagian yang relevan dari spesifikasi HTTP adalah 9.1.1 dan 9.1.2 , dan 10.3 .
sumber
Saya sarankan membangun HttpWebRequest untuk menjalankan POST Anda secara terprogram dan kemudian mengarahkan kembali setelah membaca Respons jika berlaku.
sumber
Kode copy-paste berdasarkan metode Pavlo Neyman
RedirectPost (url string, T bodyPayload) dan GetPostData () adalah bagi mereka yang hanya ingin membuang beberapa data yang sangat diketik di halaman sumber dan mengambilnya kembali di target. Data harus serialisasi oleh NewtonSoft Json.NET dan Anda perlu referensi perpustakaan tentu saja.
Cukup salin-tempel ke halaman Anda atau kelas dasar yang lebih baik untuk halaman Anda dan gunakan di mana saja di aplikasi Anda.
Hati saya keluar untuk Anda semua yang masih harus menggunakan Formulir Web pada tahun 2019 untuk alasan apa pun.
sumber
Biasanya, yang Anda perlukan hanyalah membawa beberapa kondisi di antara kedua permintaan ini. Sebenarnya ada cara yang sangat funky untuk melakukan ini yang tidak bergantung pada JavaScript (pikirkan <noscript />).
Dengan cookie itu di sana, Anda dapat dalam permintaan berikut untuk /redirect.html mengambil nama = info nilai, Anda dapat menyimpan segala jenis informasi dalam string pasangan nama / nilai ini, hingga 4K data (batas cookie tertentu). Tentu saja Anda harus menghindari ini dan menyimpan kode status dan bit bendera sebagai gantinya.
Setelah menerima permintaan ini, Anda membalasnya dengan permintaan penghapusan untuk kode status itu.
HTTP saya agak berkarat. Saya telah menggunakan RFC2109 dan RFC2965 untuk mengetahui seberapa andal ini sebenarnya, sebaiknya saya ingin cookie untuk pulang pergi sekali saja, tetapi itu sepertinya tidak mungkin, juga, cookie pihak ketiga mungkin menjadi masalah bagi Anda jika Anda pindah ke domain lain. Ini masih mungkin tetapi tidak sesakit ketika Anda melakukan hal-hal dalam domain Anda sendiri.
Masalahnya di sini adalah konkurensi, jika pengguna yang kuat menggunakan banyak tab dan mengelola untuk menyisipkan beberapa permintaan yang termasuk dalam sesi yang sama (ini sangat tidak mungkin, tetapi bukan tidak mungkin) ini dapat menyebabkan inkonsistensi dalam aplikasi Anda.
Ini adalah <noscript /> cara melakukan round trip HTTP tanpa URL dan JavaScript yang tidak berarti
Saya memberikan kode ini sebagai konsep yang luar biasa: Jika kode ini dijalankan dalam konteks yang tidak Anda kenal, saya pikir Anda dapat menentukan bagian apa yang dimaksud.
Idenya adalah bahwa Anda memanggil Relokasi dengan beberapa kondisi saat Anda mengarahkan ulang, dan URL yang Anda relokasi memanggil GetState untuk mendapatkan data (jika ada).
sumber