Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET HttpWebRequest冻结其他页面_C#_Asp.net_Httpwebrequest - Fatal编程技术网

C# ASP.NET HttpWebRequest冻结其他页面

C# ASP.NET HttpWebRequest冻结其他页面,c#,asp.net,httpwebrequest,C#,Asp.net,Httpwebrequest,如果我在页面A中设置HttpWebRequest GetResponse(),当我加载其他页面时,它将冻结,直到页面A完全加载 代码: 如何在不冻结其他页面的情况下使其异步?一点介绍: HTTP协议是一种请求/响应协议。这意味着客户端发送请求,服务器执行一些处理并返回响应 如果在处理请求的过程中,服务器需要向远程资源发出另一个请求,并将该请求的结果用于响应,那么您只能等待 也就是说,您可以通过利用和I/O完成端口来优化它。这基本上允许在执行远程HTTP请求期间释放工作线程 不要被愚弄到认为这会让

如果我在页面A中设置HttpWebRequest GetResponse(),当我加载其他页面时,它将冻结,直到页面A完全加载

代码:


如何在不冻结其他页面的情况下使其异步?

一点介绍:

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