我有一个用户提交订单的页面,在他们提交订单后,我想点击一个 url ( http://externalsite.com?id=12345&sessionid=abc123
) 而不实际将它们重定向到外部页面。
有没有办法做到这一点?
当然,使用HttpWebRequest
服务器端代码中的 an 。这是一个例子:
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...
}
如果您需要用户的 cookie(登录详细信息和其他用户设置)http://externalsite.com/
,您可以嵌入一个或伪造的图像或使用来自用户浏览器的 ajax 请求。<iframe>
使用<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 的跨浏览器 ajax 支持:
$.ajax({
url: "http://externalsite.com?id=12345&sessionid=abc123"
});
您还可以应用其他格式来隐藏 iframe 或图像,或者在其达到访问其他服务器的目的时使用 javascript 将其删除。
您可以使用WebClient类在服务器端 Asp.Net 代码中发出 HTTP 请求。然后,您可以对生成的 html 做任何您喜欢的事情。
结合上面来自 voithos 和 Joel Purra 的两个答案,我建议您也考虑第三种选择。以下是我对每一个的评价:
1) 更可靠的访问站点的方法是在服务器端作为您的操作处理程序的一部分来实际提交用户信息。这可以通过上面的 voithos 方法轻松完成:
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,强制用户的浏览器负责访问远程服务器。
<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 层,两个请求都已在客户端获得离开页面的队列之前发出。
所以 - 从工作流程和开销的角度来看可能更安全 - 但是,它需要您在 JavaScript 中编写一些 UI 级别的逻辑,这可能会出现问题,具体取决于您的项目。