我如何模拟访问网址?

时间:2012-06-20 20:17:42

标签: c# asp.net

我有一个用户提交订单的页面,在他们提交订单后,我想点击一个网址(http://externalsite.com?id=12345&sessionid=abc123)而不实际将它们重定向到外部网页。

有办法做到这一点吗?

4 个答案:

答案 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级逻辑,这可能会有问题,具体取决于你的项目。