C# 如何模拟对url的访问?

C# 如何模拟对url的访问?,c#,asp.net,C#,Asp.net,我有一个用户提交订单的页面,在他们提交订单后,我想点击一个url(http://externalsite.com?id=12345&sessionid=abc123)而不实际将它们重定向到外部页面 有办法做到这一点吗?当然,请使用服务器端代码中的。下面是一个例子: HttpWebRequest request = (HttpWebRequest)WebRequest.Create( "http://externalsite.com?id=12345&sessionid=abc12

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

有办法做到这一点吗?

当然,请使用服务器端代码中的。下面是一个例子:

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...
}

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

如果您需要
http://externalsite.com/
,您可以嵌入或伪造图像,或使用来自用户浏览器的ajax请求

使用:


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


以最简单的形式使用:

$.ajax({
url:“http://externalsite.com?id=12345&sessionid=abc123"
});

还可以应用附加格式来隐藏iFrAME/IMAGE,或者在JavaScript用于攻击另一个服务器时使用JavaScript删除它。

< P>结合以上两个答案,从VoiOS和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>

$(文档).bind('ready',函数(){
$('formSubmitButton').bind('click',函数(ev){
ev.preventDefault();//这两行停止从
ev.stopPropagation();//发生在表单提交时(即没有完整的回发)
//此行启动对服务器的异步调用,发布表单
//数据本身。
$.ajax({
url:“/My/Post/url”,
键入:“POST”,
async:false,
//您可以使用一个库来进行这种表单解析
// http://www.json.org/js.html -用于序列化,以及
// http://code.google.com/p/form2js/ -用于表单转换,太棒了。
数据:{my:'form',data:'fields'},
成功:功能(数据){
$.ajax({
url:“/The/External/url”,
键入:“POST”,
async:false,
数据:{external:'data',转到:'here'},
成功:函数(remoteData){
if(remoteData)//在此处验证响应
显示成功();
其他的
显示失败();
},
错误:displayFailure
});
},
错误:displayFailure
});
});
});
在这种方法中,您向自己的服务器发送post,一旦成功,立即向远程服务器发出第二个请求。但是,因为您要等到第二个请求被激发之后才向用户显示成功/失败,所以您知道至少在UI层,两个请求都是在客户端获得离开页面的队列之前发出的

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

您需要用户浏览器来获取它,还是只需要从服务器上执行?