게시한 다음 ASP.Net에서 외부 URL로 리디렉션하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/5179

문제

ASP.NET 서버측에서는 자체 페이지에 대한 포스트백을 제어합니다.이로 인해 사용자를 외부 페이지로 리디렉션하고 싶지만 어떤 이유로(예: 인증을 위해) 해당 페이지에 게시해야 하는 경우가 발생합니다.

HttpWebRequest 리디렉션을 원하지 않는 경우 훌륭하게 작동하고 JavaScript는 어떤 경우에는 괜찮지만 게시물에 대한 데이터를 모으기 위해 서버측 코드가 정말로 필요한 경우에는 까다로울 수 있습니다.

그렇다면 어떻게 외부 URL에 게시하고 사용자를 ASP.NET 코드 숨김 코드의 결과로 리디렉션합니까?

도움이 되었습니까?

해결책

오늘 이 문제를 해결했습니다.나는부터 시작했다 이 기사 C# Corner에서 예제가 기술적으로는 타당하지만 약간 불완전하다는 것을 발견했습니다.그가 말한 모든 것이 옳았지만 내가 원하는 대로 정확하게 작동하려면 몇 개의 외부 사이트를 방문하여 이를 종합해야 했습니다.

사용자가 기술적으로 양식을 전혀 제출하지 않은 것은 도움이 되지 않았습니다.그들은 지원 센터로 이동하기 위해 링크를 클릭하고 있었지만 http 게시물에 로그인하려면 지원 센터 사이트에 작성해야 했습니다.

이 솔루션에는 HttpContext.Current.Response.Write()를 사용하여 양식에 대한 데이터를 쓴 다음 약간의 Javascript를 사용하는 작업이 포함됩니다.

<body onload=""> 

양식을 적절한 URL로 제출하는 방법입니다.

사용자가 지원 센터 링크를 클릭하면 응답을 작성하고 사용자를 리디렉션하기 위해 다음 메서드가 호출됩니다.

public static void PassthroughAuthentication()
{

    System.Web.HttpContext.Current.Response.Write("<body 
    onload=document.forms[0].submit();window.location=\"Home.aspx\";>");

    System.Web.HttpContext.Current.Response.Write("<form name=\"Form\" 
    target=_blank method=post 
    action=\"https://external-url.com/security.asp\">");

    System.Web.HttpContext.Current.Response.Write(string.Format("<input 
       type=hidden name=\"cFName\" value=\"{0}\">", "Username"));

    System.Web.HttpContext.Current.Response.Write("</form>");
    System.Web.HttpContext.Current.Response.Write("</body>");
}

이 방법의 핵심은 페이지 본문이 로드될 때 양식을 제출한 다음 사용자를 내 홈 페이지로 다시 리디렉션하는 Javascript의 온로드 비트에 있습니다.그 이유는 새 창에서 외부 사이트를 시작하지만 사용자가 페이지를 새로 고칠 때 숨겨진 양식을 다시 제출하는 것을 원하지 않기 때문입니다.게다가 그 숨겨진 형태 때문에 페이지가 몇 픽셀 아래로 밀려서 신경이 쓰였습니다.

나는 누군가가 이것에 대해 가지고 있는 어떤 깔끔한 아이디어에 매우 관심이 있습니다.

에릭 시플

다른 팁

나는이 예제로 시작했습니다. 코드프로젝트

그런 다음 페이지에 추가하는 대신 saalon(위)에서 빌려 Response.Write()를 수행했습니다.

HttpWebRequest 클래스를 사용하여 코드에 양식 게시를 수행하겠습니다.시작하기에 좋은 도우미 클래스는 다음과 같습니다.

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

여기에서 Response.Redirect를 수행할 수도 있고, 게시물의 결과에 따라 작업을 다양하게 변경해야 할 수도 있습니다(오류가 있는 경우 사용자에게 표시하거나 무엇이든 가능).솔직히 말해서 귀하의 질문에 대한 답변이 이미 있다고 생각합니다. 실제로는 코드 뒤에서 두 가지를 모두 수행할 수 있는데 게시물 또는 리디렉션이라고 생각하는 것 같습니다.

원하는 원격 URL에 자동 게시(JavaScript 사용)하는 양식을 렌더링하여 이 작업을 수행했습니다. 웹 양식의 포스트백에서 게시물에 필요한 모든 정보를 수집한 다음 원격 게시 양식에 대한 HTML을 작성하고 다시 렌더링합니다. 클라이언트에게.

이를 위해 원격 URL과 양식의 이름/값 쌍 컬렉션을 포함하는 유틸리티 클래스를 만들었습니다.

페이지 간 게시는 관련 페이지를 모두 소유한 경우 작동하지만 다른 사이트(예: PayPal)에 게시해야 하는 경우에는 작동하지 않습니다.

ASP.NET 2.0을 사용하는 경우 다음을 사용하여 이 작업을 수행할 수 있습니다. 페이지 간 게시.

편집하다:나는 당신이 다음에 대해 묻는 사실을 놓쳤습니다. 외부 페이지.이를 위해서는 ASP.NET 페이지에서 작업이 원격 URL로 설정되고 메서드가 POST로 설정된 HTML 형식을 생성해야 한다고 생각합니다.(페이지 간 게시를 사용하면 UI가 없고 숨겨진 양식 요소만 있는 다른 페이지일 수도 있습니다.) 그런 다음 클라이언트에서 포스트백 결과가 수신되는 즉시 약간의 자바스크립트를 추가하여 양식을 제출합니다.

동일한 창에서 열어 원래 페이지에서 발생할 수 있는 프레임 문제를 처리한 다음 코드 숨김으로 외부 사이트로 리디렉션해야 했습니다.

Private Sub ExternalRedirector(ByVal externalUrl As String)
    Dim clientRedirectName As String = "ClientExternalRedirect"
    Dim externalRedirectJS As New StringBuilder()

    If Not String.IsNullOrEmpty(externalUrl) Then
        If Not Page.ClientScript.IsStartupScriptRegistered(clientRedirectName) Then
            externalRedirectJS.Append("function CheckWindow() {")
            externalRedirectJS.Append("   if (window.top != window) {")
            externalRedirectJS.Append("       window.top.location = '")
            externalRedirectJS.Append(externalUrl)
            externalRedirectJS.Append("';")
            externalRedirectJS.Append("       return false;")
            externalRedirectJS.Append("   }")
            externalRedirectJS.Append("   else {")
            externalRedirectJS.Append("   window.location = '")
            externalRedirectJS.Append(externalUrl)
            externalRedirectJS.Append("';")
            externalRedirectJS.Append("   }")
            externalRedirectJS.Append("}")
            externalRedirectJS.Append("CheckWindow();")

            Page.ClientScript.RegisterStartupScript(Page.GetType(), clientRedirectName, externalRedirectJS.ToString(), True)
        End If
    End If
End Sub
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top