如何在asp.net中发送http请求而无需等待响应并且不占用资源

时间:2009-01-16 04:21:52

标签: .net httpwebrequest

在ASP.Net应用程序中,我需要通过http POST将一些数据(urlEncodedUserInput)发送到外部服务器以响应用户输入,而不会阻止页面响应。来自其他服务器的响应无关紧要,我不关心请求是否有时失败。这似乎运行正常(见下文),但我担心它会在后台占用资源,等待永远不会使用的响应。

以下是代码:

httpRequest = WebRequest.Create(externalServerUrl);

httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8";

bytedata = Encoding.UTF8.GetBytes(urlEncodedUserInput);
httpRequest.ContentLength = bytedata.Length;

requestStream = httpRequest.GetRequestStream();
requestStream.Write(bytedata, 0, bytedata.Length);
requestStream.Close();

非常标准的东西,但是如果你想异步接收响应,通常在这一点你会调用httpRequest.getResponse()或httpRequest.beginGetResponse(),但在我的场景中似乎没有必要。

我做对了吗?我应该调用httpRequest.Abort()来清理还是可以阻止请求在慢速连接上发送?

2 个答案:

答案 0 :(得分:7)

我认为Threadpool.QueueUserWorkItem正是您所寻找的。通过添加lambdas和匿名类型,这可以非常简单:

var request = new { url = externalServerUrl, input = urlEncodedUserInput };
ThreadPool.QueueUserWorkItem(
    (data) =>
    {
         httpRequest = WebRequest.Create(data.url);

         httpRequest.Method = "POST";
         httpRequest.ContentType = "application/x-www-form-urlencoded;charset=utf-8";

         bytedata = Encoding.UTF8.GetBytes(data.input);
         httpRequest.ContentLength = bytedata.Length;

         requestStream = httpRequest.GetRequestStream();
         requestStream.Write(bytedata, 0, bytedata.Length);
         requestStream.Close();
         //and so on
     }, request);

答案 1 :(得分:0)

我能想到你能从其他请求得到快速响应的唯一方法是让你发布的页面使用ThreadPool.QueueUserWorkItem打开一个线程,以便主线程在时间之前完成响应消费工作已经完成。您应该知道,一旦主线程退出,您将无法访问HttpContext,这意味着没有缓存,服务器变量等...除非您在新线程中模拟具有权限的用户,否则共享驱动器将无法工作。线程很好,但有很多事情要注意。