게시한 다음 ASP.Net에서 외부 URL로 리디렉션하려면 어떻게 해야 합니까?
-
08-06-2019 - |
문제
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