我如何模拟访问url?

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

有没有办法做到这一点?

当然,从服务器端代码使用HttpWebRequest 。 这是一个例子:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create( "http://sofzh.miximages.com/c%23/externalsite.com"); 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://externalsite.com/上的用户cookie(登录详细信息和其他用户设置),您可以嵌入 伪造图像使用用户浏览器的ajax请求。

使用

  

使用“伪造”图像请求(如果您可以忽略任何潜在的图像类型问题):

  

以最简单的forms使用jQuery的跨浏览器ajax支持 :

 $.ajax({ url: "http://sofzh.miximages.com/c%23/externalsite.com" }); 

您还可以应用其他格式来隐藏iframe或图像,或者当它用于命中其他服务器时,使用javascript将其删除。

您可以使用WebClient类在服务器端Asp.Net代码中发出HTTP请求。 然后,您可以使用生成的html执行任何您喜欢的操作。

结合上面的两个答案,来自voithos和Joel Purra,我建议你考虑第三种选择。 以下是我对每个人的评估:

1)更有把握的网站访问方式是将服务器端作为操作处理程序的一部分,以实际提交用户信息。 这可以通过上面的voithos方法轻松完成:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create( "http://sofzh.miximages.com/c%23/externalsite.com"); 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请求的开销。 如果其他服务器运行缓慢,则可能会产生阻塞问题,从而导致结果明显变慢。 你可以通过multithreading/异步来解决这个问题 – 但是你得到的结论是:它引入了一些无法控制的问题 – 但它确保你知道远程源是否被击中,以及回复是什么。

2)或者,如果您的用户正在发布实际post并将HTML响应作为新页面返回,您可以简单地将Joel Purra的响应注入到结果页面的HTML中,从而迫使用户的浏览器负责点击远程服务器。

 

这种方法的缺点是,如果无论出于何种原因,您的客户端触发请求并且不等待下一页加载,外部站点返回404错误等,不仅外部处理不会完成 – 你不会知道它没有完成。

3)如果你有能力使用像jQuery这样的客户端库来进行处理,我建议你让所有的表单提交都是在线和异步进行的。 方法是这样的:

  

在此方法中 – 您将邮件发送到您自己的服务器,并且在成功时 – 立即启动对远程服务器的第二个请求。 但是,因为您等到第二个请求被触发之后才等到用户显示成功/失败 – 您知道至少在UI层,两个请求都是在客户端获取队列离开页面之前发出的。

所以 – 从工作流程和开销的角度来看可能更安全 – 但是,它需要您在JavaScript中编写一些UI级逻辑,这可能会有问题,具体取决于您的项目。