Mat*_*wdy 242 asp.net https response.redirect
我们需要提交表单并保存一些数据,然后将用户重定向到异地页面,但在重定向时,我们需要使用POST"提交"表单,而不是GET.
我希望有一个简单的方法来实现这一目标,但我开始认为没有.我想我现在必须创建一个简单的其他页面,只需要我想要的表单,重定向到它,填充表单变量,然后对只调用document.forms [0] .submit的脚本执行body.onload调用( );
任何人都可以告诉我是否有其他选择?我们可能需要稍后在项目中调整它,它可能会变得有点复杂,所以如果有一个简单的我们可以做到这一切所有非其他页面依赖,这将是太棒了.
无论如何,感谢任何和所有的回应.
tgh*_*ghw 224
这样做需要了解HTTP重定向的工作方式.当您使用时Response.Redirect()
,您使用HTTP状态代码302发送响应(发出请求的浏览器),该状态代码告诉浏览器接下来要去哪里.根据定义,浏览器将通过GET
请求进行,即使原始请求是a 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");
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并不总是有效. 不同的浏览器以不同的方式实现它,因为它不是常见的状态代码.
唉,与Opera和FireFox开发人员不同,IE开发人员从未阅读过规范,即使是最新的,最安全的IE7也会将POST请求从域A重定向到域B,而不会发出任何警告或确认对话框!Safari也以有趣的方式运行,虽然它没有引发确认对话框并执行重定向,但它会丢弃POST数据,有效地将307重定向更改为更常见的302.
所以,据我所知,实现这样的事情的唯一方法是使用Javascript.我可以想到两个选项:
action
属性指向第三方服务器.然后,将click事件添加到提交按钮,该按钮首先使用数据向服务器执行AJAX请求,然后允许将表单提交给第三方服务器.在这两个中,我会选择第二个,原因有两个.首先,它比第一个更可靠,因为它不需要Javascript工作; 对于那些没有启用它的人,你总是可以看到隐藏表单的提交按钮,并指示他们按下它需要超过5秒.其次,您可以决定将哪些数据传输到第三方服务器; 如果你只使用处理表单,你将传递所有的帖子数据,这并不总是你想要的.同样适用于307解决方案,假设它适用于所有用户.
希望这可以帮助!
Pav*_*man 118
你可以使用这个方法:
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();
Run Code Online (Sandbox Code Playgroud)
结果就在客户端从服务器获取所有html之后,事件onload发生触发表单提交并将所有数据发布到定义的postbackUrl.
Fly*_*wat 31
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");
Run Code Online (Sandbox Code Playgroud)
但是,如果您需要用户从此表单中查看响应页面,您唯一的选择是使用Server.Transfer,这可能会也可能不起作用.
这应该让生活更轻松.您可以轻松地在Web应用程序中使用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
Run Code Online (Sandbox Code Playgroud)
ASP.Net 3.5中的新功能是ASP按钮的"PostBackUrl"属性.您可以将其设置为您要直接发布到的页面的地址,当单击该按钮时,而不是像平常一样回发到同一页面,而是发布到您指定的页面.便利.确保UseSubmitBehavior也设置为TRUE.
认为分享 heroku 使用附加提供程序的 SSO 执行此操作可能会很有趣
在“kensa”工具的源代码中可以看到它是如何工作的一个例子:
如果您打开 javascript,则可以在实践中看到。示例页面来源:
<!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>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
237214 次 |
最近记录: |