我有一个用户提交订单的页面,在他们提交订单后,我想点击一个网址(http://externalsite.com?id=12345&sessionid=abc123
)而不实际将它们重定向到外部网页。
有办法做到这一点吗?
答案 0 :(得分:8)
当然,请使用服务器端代码中的HttpWebRequest
。这是一个例子:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
"http://externalsite.com?id=12345&sessionid=abc123");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
// Process the response text if you need to...
}
答案 1 :(得分:5)
如果您需要http://externalsite.com/
上的用户Cookie(登录详细信息和其他用户设置),则可以嵌入<iframe>
或伪造的图片或使用来自用户浏览器的ajax请求。
使用<iframe>
:
<iframe src="http://externalsite.com?id=12345&sessionid=abc123" width="1" height="1" frameborder="0"></iframe>
使用“伪造”图像请求(如果您可以忽略任何潜在的图像类型问题):
<img src="http://externalsite.com?id=12345&sessionid=abc123" width="1" height="1" />
以最简单的形式使用jQuery's cross-browser ajax support:
$.ajax({
url: "http://externalsite.com?id=12345&sessionid=abc123"
});
您还可以应用其他格式来隐藏iframe或图片,或者当它用于点击其他服务器时,使用javascript将其删除。
答案 2 :(得分:2)
您可以使用WebClient类在服务器端Asp.Net代码中发出HTTP请求。然后,您可以使用生成的html执行任何您喜欢的操作。
答案 3 :(得分:0)
结合上面的两个答案,来自voithos和Joel Purra,我建议你考虑第三种选择。以下是我对每个人的评估:
1)更有把握的网站访问方式是将服务器端作为操作处理程序的一部分,以便实际提交用户的信息。这可以通过voithos&#39;轻松完成。上面的方法:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
"http://externalsite.com?id=12345&sessionid=abc123");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
// Process the response text if you need to...
}
这允许您的服务器访问其服务器并确保它被调用。这种方法的缺点是它使您的服务器具有辅助HTTP请求的开销。如果另一台服务器运行缓慢,则可能会产生阻塞问题,从而导致结果明显变慢。你可以通过多线程/异步来解决这个问题 - 但是你得到的结论是:它引入了一些无法控制的问题 - 但它确保你知道远程源是否被击中,以及答案是什么。
2)或者,如果您的用户正在发布实际帖子并将HTML响应作为新页面返回,您只需将Joel Purra的响应注入到该结果页面的HTML中,从而迫使用户和#39;浏览器负责点击远程服务器。
<div style="display: none;">
<iframe src="http://externalsite.com?id=12345&sessionid=abc123"></iframe>
</div>
这种方法的缺点是,如果由于某种原因,您的客户端触发请求并且不等待下一页加载,外部站点将返回404错误等,不仅是外部的处理没有完成 - 你不知道它没有完成。
3)如果您能够使用客户端库(如jQuery)进行处理,我建议您将所有表单提交以串联和异步方式进行。方法是这样的:
<script type="text/javascript">
$(document).bind('ready', function () {
$('#formSubmitButton').bind('click', function (ev) {
ev.preventDefault(); // These two lines stop the default processing from
ev.stopPropagation(); // occurring on form-submit (i.e. no full post-back)
// This line starts an asynchronous call to the server, posting your form
// data itself.
$.ajax({
url: '/My/Post/Url',
type: 'POST',
async: false,
// You could use a library for this kind of form parsing. I suggest
// http://www.json.org/js.html - for serialization, and
// http://code.google.com/p/form2js/ - for form conversion. It's great.
data: { my: 'form', data: 'fields' },
success: function (data) {
$.ajax({
url: '/The/External/Url',
type: 'POST',
async: false,
data: { external: 'data', goes: 'here' },
success: function (remoteData) {
if (remoteData) // validate response here
displaySuccess();
else
displayFailure();
},
error: displayFailure
});
},
error: displayFailure
});
});
});
</script>
在此方法中 - 您将帖子发送到您自己的服务器,并且在成功时 - 立即触发对远程服务器的第二个请求。但是,因为您等到第二个请求被触发之后才等待向用户显示成功/失败 - 您知道至少在UI层,两个请求都是在客户端获取队列离开页面之前发出的。 / p>
所以 - 从工作流程和开销的角度来看可能更安全 - 但是,它要求你在JavaScript中编写一些UI级逻辑,这可能会有问题,具体取决于你的项目。