Tenemos el requisito de enviar un formulario y guardar algunos datos, luego redirigir al usuario a una página fuera del sitio, pero al redirigirnos, debemos "enviar" un formulario con POST, no GET.
Esperaba que hubiera una manera fácil de lograr esto, pero estoy empezando a pensar que no la hay. Creo que ahora debo crear una página simple, con solo el formulario que quiero, redirigir a ella, completar las variables del formulario, luego hacer una llamada body.onload a un script que simplemente llama a document.forms [0] .submit ( );
¿Alguien puede decirme si hay una alternativa? Es posible que necesitemos ajustar esto más adelante en el proyecto, y puede ser un poco complicado, por lo que si hubiera una solución fácil, podríamos hacer esto sin depender de otra página, sería fantástico.
De todos modos, gracias por todas y cada una de las respuestas.
fuente
Respuestas:
Hacer esto requiere comprender cómo funcionan las redirecciones HTTP. Cuando lo usa
Response.Redirect()
, envía una respuesta (al navegador que realizó la solicitud) con el Código de estado HTTP 302 , que le indica al navegador a dónde ir después. Por definición, el navegador lo hará a través de unaGET
solicitud, incluso si la solicitud original era aPOST
.Otra opción es usar el Código de estado HTTP 307 , que especifica que el navegador debe realizar la solicitud de redireccionamiento de la misma manera que la solicitud original, pero para avisar al usuario con una advertencia de seguridad. Para hacer eso, escribirías algo como esto:
Desafortunadamente, esto no siempre funcionará. Diferentes navegadores implementan esto de manera diferente , ya que no es un código de estado común.
Entonces, hasta donde yo sé, la única forma de implementar algo como esto sería usar Javascript. Hay dos opciones que se me ocurren en la cabeza:
action
atributo apunte al servidor de terceros. Luego, agregue un evento de clic al botón de envío que primero ejecuta una solicitud AJAX a su servidor con los datos, y luego permite que el formulario se envíe al servidor de terceros.De los dos, elegiría el segundo, por dos razones. Primero, es más confiable que el primero porque no se requiere Javascript para que funcione; Para aquellos que no lo tienen habilitado, siempre puede hacer visible el botón de envío para el formulario oculto e indicarles que lo presionen si demora más de 5 segundos. En segundo lugar, puede decidir qué datos se transmiten al servidor de terceros; si usa solo procesa el formulario a medida que pasa, pasará todos los datos de la publicación, que no siempre es lo que desea. Lo mismo para la solución 307, suponiendo que funcionó para todos sus usuarios.
¡Espero que esto ayude!
fuente
Puedes usar este enfoque:
Como resultado, justo después de que el cliente obtenga todo el html del servidor, se produce la carga del evento que activa el envío del formulario y publica todos los datos en postbackUrl definido.
fuente
HttpWebRequest se utiliza para esto.
En la devolución de datos, cree una HttpWebRequest a su tercero y publique los datos del formulario, luego, una vez hecho, puede Response.Redirect donde quiera.
Obtiene la ventaja adicional de que no tiene que nombrar todos los controles de su servidor para hacer el formulario de terceros, puede hacer esta traducción al crear la cadena POST.
Sin embargo, si necesita que el usuario vea la página de respuestas de este formulario, su única opción es utilizar Server.Transfer, y eso puede o no funcionar.
fuente
Esto debería hacer la vida mucho más fácil. Simplemente puede usar fácilmente el método Response.RedirectWithData (...) en su aplicación web.
fuente
Algo nuevo en ASP.Net 3.5 es esta propiedad "PostBackUrl" de los botones ASP. Puede establecerlo en la dirección de la página en la que desea publicar directamente, y cuando se hace clic en ese botón, en lugar de volver a publicar en la misma página como de costumbre, en su lugar publica en la página que ha indicado. Práctico. Asegúrese de que UseSubmitBehavior también esté establecido en TRUE.
fuente
Pensé que podría ser interesante compartir que heroku hace esto con su SSO para proveedores de complementos
Se puede ver un ejemplo de cómo funciona en la fuente de la herramienta "kensa":
https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb
Y se puede ver en la práctica si desactiva JavaScript. Fuente de página de ejemplo:
fuente
PostbackUrl se puede configurar en su botón asp para publicar en una página diferente.
si necesita hacerlo en código detrás, intente Server.Transfer.
fuente
@Mate,
Todavía puede usar HttpWebRequest, luego dirigir la respuesta que recibe a la respuesta del flujo de salida real, esto le devolvería la respuesta al usuario. El único problema es que cualquier URL relativa se rompería.
Aún así, eso puede funcionar.
fuente
Esto es lo que haría:
Ponga los datos en un formulario estándar (sin atributo runat = "server") y configure la acción del formulario para publicar en la página de destino fuera del sitio. Antes de enviar, enviaría los datos a mi servidor usando una XmlHttpRequest y analizaría la respuesta. Si la respuesta significa que debe continuar con la PUBLICACIÓN fuera del sitio, entonces yo (el JavaScript) procedería con la publicación; de lo contrario, redirigiría a una página en mi sitio
fuente
Sí, HttpWebRequest, mira mi publicación a continuación.
fuente
El método GET (y HEAD) nunca debe usarse para hacer algo que tenga efectos secundarios. Un efecto secundario podría estar actualizando el estado de una aplicación web, o podría estar cargando su tarjeta de crédito. Si una acción tiene efectos secundarios, se debe utilizar otro método (POST).
Por lo tanto, un usuario (o su navegador) no debe ser considerado responsable de algo hecho por un GET. Si ocurriera algún efecto secundario dañino o costoso como resultado de un GET, eso sería culpa de la aplicación web, no del usuario. Según la especificación, un agente de usuario no debe seguir automáticamente una redirección a menos que sea una respuesta a una solicitud GET o HEAD.
Por supuesto, muchas solicitudes GET tienen algunos efectos secundarios, incluso si solo se agregan a un archivo de registro. Lo importante es que la aplicación, no el usuario, se haga responsable de esos efectos.
Las secciones relevantes de la especificación HTTP son 9.1.1 y 9.1.2 , y 10.3 .
fuente
Sugiero construir una HttpWebRequest para ejecutar programáticamente su POST y luego redirigir después de leer la Respuesta, si corresponde.
fuente
Código copiable y pegado basado en el método de Pavlo Neyman
RedirectPost (string url, T bodyPayload) y GetPostData () son para aquellos que solo quieren volcar algunos datos fuertemente tipados en la página de origen y recuperarlos en el destino. NewtonSoft Json.NET debe poder serializar los datos y, por supuesto, debe hacer referencia a la biblioteca.
Simplemente copie y pegue en su (s) página (s) o mejor aún, la clase base para sus páginas y úsela en cualquier lugar de su aplicación.
Mi corazón está con todos ustedes que todavía tienen que usar Web Forms en 2019 por cualquier razón.
fuente
Por lo general, todo lo que necesitará es llevar algún estado entre estas dos solicitudes. En realidad, hay una forma realmente funky de hacer esto que no se basa en JavaScript (piense en <noscript />).
Con esa cookie allí, puede en la siguiente solicitud para /redirect.html recuperar la información nombre = valor, puede almacenar cualquier tipo de información en esta cadena de par nombre / valor, hasta por ejemplo 4K de datos (límite de cookie típico). Por supuesto, debe evitar esto y almacenar códigos de estado y bits de bandera en su lugar.
Al recibir esta solicitud, a cambio, responde con una solicitud de eliminación para ese código de estado.
Mi HTTP está un poco oxidado. He estado revisando RFC2109 y RFC2965 para determinar qué tan confiable es realmente, preferiblemente me gustaría que la cookie se redondeara exactamente una vez, pero eso no parece ser posible, también, cookies de terceros. podría ser un problema para usted si se traslada a otro dominio. Esto todavía es posible, pero no tan fácil como cuando estás haciendo cosas dentro de tu propio dominio.
El problema aquí es la concurrencia, si un usuario avanzado está usando múltiples pestañas y logra intercalar un par de solicitudes que pertenecen a la misma sesión (esto es muy poco probable, pero no imposible), esto puede generar inconsistencias en su aplicación.
Es la forma <noscript /> de realizar viajes de ida y vuelta HTTP sin URL y JavaScript sin sentido
Proporciono este código como un concepto de concepto: si este código se ejecuta en un contexto con el que no está familiarizado, creo que puede averiguar qué parte es qué.
La idea es que llame a Relocate con algún estado cuando redirija, y la URL que reubicó llama a GetState para obtener los datos (si corresponde).
fuente