[asp.net] Response.Redirect con POST anziché Get?



Answers

Puoi usare questo approccio:

Response.Clear();

StringBuilder sb = new StringBuilder();
sb.Append("<html>");
sb.AppendFormat(@"<body onload='document.forms[""form""].submit()'>");
sb.AppendFormat("<form name='form' action='{0}' method='post'>",postbackUrl);
sb.AppendFormat("<input type='hidden' name='id' value='{0}'>", id);
// Other params go here
sb.Append("</form>");
sb.Append("</body>");
sb.Append("</html>");

Response.Write(sb.ToString());

Response.End();

Come risultato, subito dopo il client otterrà tutto il codice HTML dal server, si verificherà l'evento onload che attiva il modulo invia e pubblica tutti i dati su definito postbackUrl.

Question

Abbiamo l'obbligo di inviare un modulo di invio e salvare alcuni dati, quindi reindirizzare l'utente a una pagina esterna, ma nel reindirizzamento, dobbiamo "inviare" un modulo con POST, non GET.

Speravo che ci fosse un modo semplice per realizzare questo, ma sto iniziando a pensare che non ci sia. Penso che ora devo creare una semplice altra pagina, con solo la forma che voglio, reindirizzare ad essa, compilare le variabili del modulo, quindi fare un body.on caricare la chiamata a uno script che chiama semplicemente document.forms [0] .submit ( );

Qualcuno può dirmi se c'è un'alternativa? Potremmo aver bisogno di modificarlo più avanti nel progetto, e potrebbe essere complicato, quindi se ci fosse un modo facile potremmo fare tutto ciò che non dipende da altre pagine sarebbe fantastico.

Comunque, grazie per tutte le risposte.




@Opaco,

È comunque possibile utilizzare HttpWebRequest, quindi indirizzare la risposta ricevuta alla risposta outputstream effettiva, ciò restituirebbe all'utente la risposta. L'unico problema è che qualsiasi url relativo sarebbe rotto.

Comunque, potrebbe funzionare.




In PHP, puoi inviare i dati POST con cURL. C'è qualcosa di comparabile per .NET?

Sì, HttpWebRequest, vedi il mio post qui sotto.




Ho pensato che potrebbe essere interessante condividere che heroku fa questo con il suo SSO ai fornitori di componenti aggiuntivi

Un esempio di come funziona può essere visto nella sorgente allo strumento "kensa":

https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb

E può essere visto in pratica se si gira di javascript. Origine della pagina di esempio:

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Heroku Add-ons SSO</title>
  </head>

  <body>
    <form method="POST" action="https://XXXXXXXX/sso/login">

        <input type="hidden" name="email" value="XXXXXXXX" />

        <input type="hidden" name="app" value="XXXXXXXXXX" />

        <input type="hidden" name="id" value="XXXXXXXX" />

        <input type="hidden" name="timestamp" value="1382728968" />

        <input type="hidden" name="token" value="XXXXXXX" />

        <input type="hidden" name="nav-data" value="XXXXXXXXX" />

    </form>

    <script type="text/javascript">
      document.forms[0].submit();
    </script>
  </body>
</html>



Questo dovrebbe rendere la vita molto più facile. Puoi semplicemente utilizzare il metodo Response.RedirectWithData (...) nella tua applicazione web facilmente.

Imports System.Web
Imports System.Runtime.CompilerServices

Module WebExtensions

    <Extension()> _
    Public Sub RedirectWithData(ByRef aThis As HttpResponse, ByVal aDestination As String, _
                                ByVal aData As NameValueCollection)
        aThis.Clear()
        Dim sb As StringBuilder = New StringBuilder()

        sb.Append("<html>")
        sb.AppendFormat("<body onload='document.forms[""form""].submit()'>")
        sb.AppendFormat("<form name='form' action='{0}' method='post'>", aDestination)

        For Each key As String In aData
            sb.AppendFormat("<input type='hidden' name='{0}' value='{1}' />", key, aData(key))
        Next

        sb.Append("</form>")
        sb.Append("</body>")
        sb.Append("</html>")

        aThis.Write(sb.ToString())

        aThis.End()
    End Sub

End Module



Il metodo GET (e HEAD) non dovrebbe mai essere usato per fare qualsiasi cosa che abbia effetti collaterali. Un effetto collaterale potrebbe essere l'aggiornamento dello stato di un'applicazione web, o potrebbe essere l'addebito sulla tua carta di credito. Se un'azione ha effetti collaterali, dovrebbe essere usato un altro metodo (POST).

Quindi, un utente (o il suo browser) non dovrebbe essere ritenuto responsabile per qualcosa fatto da un GET. Se alcuni effetti collaterali dannosi o costosi si sono verificati in seguito a un GET, ciò sarebbe dovuto all'applicazione Web e non all'utente. Secondo la specifica, un agente utente non deve seguire automaticamente un reindirizzamento a meno che non si tratti di una risposta a una richiesta GET o HEAD.

Naturalmente, molte richieste GET hanno alcuni effetti collaterali, anche se si tratta solo di un file di registro. L'importante è che l'applicazione, non l'utente, debba essere ritenuta responsabile di tali effetti.

Le sezioni pertinenti delle specifiche HTTP sono 9.1.1 e 9.1.2 e 10.3 .




Related