C# ASP.NET HttpWebRequest冻结其他页面
如果我在页面A中设置HttpWebRequest GetResponse(),当我加载其他页面时,它将冻结,直到页面A完全加载 代码:C# ASP.NET HttpWebRequest冻结其他页面,c#,asp.net,httpwebrequest,C#,Asp.net,Httpwebrequest,如果我在页面A中设置HttpWebRequest GetResponse(),当我加载其他页面时,它将冻结,直到页面A完全加载 代码: 如何在不冻结其他页面的情况下使其异步?一点介绍: HTTP协议是一种请求/响应协议。这意味着客户端发送请求,服务器执行一些处理并返回响应 如果在处理请求的过程中,服务器需要向远程资源发出另一个请求,并将该请求的结果用于响应,那么您只能等待 也就是说,您可以通过利用和I/O完成端口来优化它。这基本上允许在执行远程HTTP请求期间释放工作线程 不要被愚弄到认为这会让
如何在不冻结其他页面的情况下使其异步?一点介绍: HTTP协议是一种请求/响应协议。这意味着客户端发送请求,服务器执行一些处理并返回响应 如果在处理请求的过程中,服务器需要向远程资源发出另一个请求,并将该请求的结果用于响应,那么您只能等待 也就是说,您可以通过利用和I/O完成端口来优化它。这基本上允许在执行远程HTTP请求期间释放工作线程 不要被愚弄到认为这会让反应更快。如果远程服务器运行缓慢,它不会危及工作线程。这意味着您的应用程序将能够为其他请求提供服务 为了实现这一点,可以使用HttpWebRequest的
BeginGetResponse/EndGetResponse
方法。它们允许利用I/O完成端口进行异步执行
在我前面的回答中链接的文章中,您将发现如何使ASP.NET页面(或者如果您使用的是处理程序)异步
第一步是将WebForm标记为异步:
<%@ Page Async="true" ... %>
作为这种方法的替代,您可以考虑更快地加载页面,然后向另一个处理程序触发Ajax请求,该处理程序将执行远程请求并返回结果。在这种情况下,初始请求页面的加载速度会更快,不会被冻结,但一旦远程请求完成处理,结果会在稍后出现
但在这两种情况下,我都建议您利用异步页面来避免阻塞工作线程,这可能会给您的应用程序带来灾难性的后果,尤其是当您访问的远程服务器由于某种原因速度较慢时。感谢您的详细解释!
<%@ Page Async="true" ... %>
using System;
using System.IO;
using System.Net;
using System.Web;
public partial class WebForm1 : System.Web.UI.Page
{
private HttpWebRequest request;
protected void Page_Load(object sender, EventArgs e)
{
this.AddOnPreRenderCompleteAsync(
new BeginEventHandler(this.BeginAsyncOperation),
new EndEventHandler(this.EndAsyncOperation)
);
}
private IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback cb, object state)
{
string url = "http://example.com";
string method = "GET";
this.request = (HttpWebRequest)WebRequest.Create(url);
this.request.Method = method;
this.request.Accept = "text/javascript, text/html, application/xml, text/xml, */*";
this.request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
this.request.Host = "steamcommunity.com";
this.request.UserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11";
return this.request.BeginGetResponse(cb, state);
}
private void EndAsyncOperation(IAsyncResult ar)
{
using (WebResponse response = this.request.EndGetResponse(ar))
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
// TODO: do something with the result here => like binding
// it to some Web Control or displaying it somewhere on the page
}
}
}