[asp.net] Get. 대신 POST로 리디렉션?

양식을 제출하고 일부 데이터를 저장 한 다음 사용자를 페이지 외부로 리디렉션해야하지만 리디렉션에서는 GET이 아닌 POST로 양식을 “제출”해야합니다.

나는 이것을 달성하는 쉬운 방법이 있기를 바랐지만, 그렇지 않다고 생각하기 시작했다. 이제 원하는 양식만으로 간단한 다른 페이지를 작성하고, 리디렉션하고, 양식 변수를 채운 다음 document.forms [0] .submit ( );

대안이 있는지 아는 사람이 있습니까? 우리는 나중에 프로젝트에서 이것을 조정해야 할 수도 있고, 다소 복잡해 질 수도 있습니다. 따라서 쉬운 경우에는 페이지가 아닌 다른 모든 페이지에 환상적 일 수 있습니다.

어쨌든 모든 응답에 감사드립니다.



답변

이렇게하려면 HTTP 리디렉션 작동 방식을 이해해야합니다. 사용할 때Response.Redirect() HTTP 상태 코드 302 로 응답을 보내 (브라우저에게 요청) 브라우저에 다음으로 이동할 위치를 알려줍니다. 정의에 따르면 브라우저는 GET원래 요청이 이었더라도 요청을 통해이를 수행 POST합니다.

다른 옵션은 HTTP 상태 코드 307 하는 것인데, 이는 브라우저가 원래 요청과 동일한 방식으로 경로 재 지정 요청을 수행하도록 지정하지만 사용자에게 보안 경고를 표시하도록 지정합니다. 그렇게하려면 다음과 같이 작성하십시오.

public void PageLoad(object sender, EventArgs e)
{
    // Process the post on your side   

    Response.Status = "307 Temporary Redirect";
    Response.AddHeader("Location", "http://example.com/page/to/post.to");
}

불행히도, 이것이 항상 작동하지는 않습니다. 다른 브라우저 는 일반적인 상태 코드가 아니기 때문에 이것을 다르게 구현 합니다.

아아, Opera 및 FireFox 개발자와 달리 IE 개발자는 사양을 읽지 않았으며 가장 안전한 최신 IE7조차도 경고 또는 확인 대화 상자없이 POST 요청을 도메인 A에서 도메인 B로 리디렉션합니다! Safari는 재미있는 방식으로 작동하지만 확인 대화 상자를 표시하지 않고 리디렉션을 수행하지만 POST 데이터를 버리고 307 리디렉션을 더 일반적인 302로 효과적으로 변경합니다.

그래서 내가 아는 한, 이와 같은 것을 구현하는 유일한 방법은 Javascript를 사용하는 것입니다. 머리 꼭대기에서 생각할 수있는 두 가지 옵션이 있습니다.

  1. 양식을 작성하고 action 속성이 타사 서버를 가리 키도록합니다. 그런 다음 제출 단추에 클릭 이벤트를 추가하여 먼저 데이터와 함께 서버에 AJAX 요청을 실행 한 다음 양식을 타사 서버에 제출할 수 있습니다.
  2. 서버에 게시 할 양식을 작성하십시오. 양식이 제출되면 사용자에게 전달하려는 모든 데이터가 포함 된 양식이있는 페이지를 숨겨진 입력으로 표시하십시오. “리 디렉팅 …”과 같은 메시지를 표시하십시오. 그런 다음, 서드 파티 서버에 양식을 제출하는 페이지에 javascript 이벤트를 추가하십시오.

두 가지 중에서 두 가지 이유로 두 번째를 선택합니다. 첫째, Javascript가 작동하는 데 필요하지 않기 때문에 첫 번째보다 더 안정적입니다. 사용하도록 설정하지 않은 사용자의 경우 숨겨진 양식의 제출 버튼을 항상 표시하고 5 초 이상 걸리는 경우이를 누르도록 지시 할 수 있습니다. 둘째, 타사 서버로 전송할 데이터를 결정할 수 있습니다. 사용하는 양식 만 처리하면 모든 게시물 데이터가 전달되므로 항상 원하는 것은 아닙니다. 모든 사용자에게 효과적이라고 가정하면 307 솔루션과 동일합니다.

도움이 되었기를 바랍니다!


답변

이 aproach를 사용할 수 있습니다 :

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();

결과적으로 클라이언트가 서버에서 모든 HTML을 가져온 직후 이벤트 onload 가 발생하여 양식 제출을 트리거하고 모든 데이터를 정의 된 postbackUrl에 게시합니다.


답변

이를 위해 HttpWebRequest가 사용됩니다.

포스트 백에서 HttpWebRequest를 써드 파티에 작성하고 양식 데이터를 게시 한 후 완료되면 원하는 위치에 Response.Redirect 할 수 있습니다.

타사 양식을 만들기 위해 모든 서버 컨트롤의 이름을 지정할 필요가 없다는 추가 이점이 있습니다. POST 문자열을 작성할 때이 변환을 수행 할 수 있습니다.

string url = "3rd Party Url";

StringBuilder postData = new StringBuilder();

postData.Append("first_name=" + HttpUtility.UrlEncode(txtFirstName.Text) + "&");
postData.Append("last_name=" + HttpUtility.UrlEncode(txtLastName.Text));

//ETC for all Form Elements

// Now to Send Data.
StreamWriter writer = null;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.ToString().Length;
try
{
    writer = new StreamWriter(request.GetRequestStream());
    writer.Write(postData.ToString());
}
finally
{
    if (writer != null)
        writer.Close();
}

Response.Redirect("NewPage");

그러나 사용자가이 양식에서 응답 페이지를 보도록하려면 Server.Transfer를 사용하는 것이 유일한 옵션이며 작동하지 않을 수도 있습니다.


답변

이것은 인생을 훨씬 쉽게 만들어 줄 것입니다. 웹 응용 프로그램에서 Response.RedirectWithData (…) 메서드를 쉽게 사용할 수 있습니다.

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


답변

ASP.Net 3.5의 새로운 기능은 ASP 버튼의 “PostBackUrl”속성입니다. 직접 게시하려는 페이지의 주소로 설정할 수 있으며, 버튼을 클릭하면 일반 페이지와 같은 페이지에 다시 게시하는 대신 지정한 페이지에 게시됩니다. 능숙한. UseSubmitBehavior도 TRUE로 설정되어 있는지 확인하십시오.


답변

Heroku가 애드온 제공 업체에 대한 SSO와 함께이 작업을 수행한다는 사실을 공유하는 것이 흥미로울 수 있습니다.

작동 방식의 예는 “kensa”도구의 소스에서 확인할 수 있습니다.

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

그리고 자바 스크립트를 켜면 실제로 볼 수 있습니다. 페이지 소스 예 :

<!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>


답변

ASP 버튼에서 PostbackUrl을 설정하여 다른 페이지에 게시 할 수 있습니다.

코드 숨김으로해야 할 경우 Server.Transfer를 사용해보십시오.