首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET HttpWebRequest冻结其他页面

ASP.NET HttpWebRequest冻结其他页面
EN

Stack Overflow用户
提问于 2013-12-29 09:37:10
回答 1查看 578关注 0票数 0

如果我在A页中生成HttpWebRequest GetResponse(),当我加载其他页面时,它会冻结,直到页面A被完全加载。

代码:

代码语言:javascript
运行
复制
    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

    request.Method = method;

    request.Accept = "text/javascript, text/html, application/xml, text/xml, */*";
    request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
    request.Host = "steamcommunity.com";
    request.UserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11";

    // Get the response
    return request.GetResponse() as HttpWebResponse;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-29 09:40:12

简单介绍一下:

HTTP协议是请求/响应协议。这意味着客户端发送请求,服务器执行一些处理并返回响应。

如果在处理请求的过程中,服务器需要向远程资源发出另一个请求,并将此请求的结果用于响应,则只能等待。

这就是说,您可以通过利用asynchronous pages和I/O完成端口来优化它。这基本上允许在执行远程HTTP请求期间释放工作线程。

不要被愚弄到认为这会使反应更快。如果远程服务器运行缓慢,它将不会危及您的工作线程。这意味着您的应用程序将能够处理其他请求。

为了实现这一点,您可以使用HttpWebRequest的HttpWebRequest方法。它们允许利用I/O完成端口进行异步执行。

在前面链接的文章中,您将发现如何使您的ASP.NET页面(或者如果您使用处理程序)是异步的。

第一步是标记WebForm异步:

代码语言:javascript
运行
复制
<%@ Page Async="true" ... %>

然后可以使用AddOnPreRenderCompleteAsync方法注册异步任务:

代码语言:javascript
运行
复制
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
        } 
    }
}

作为这种方法的另一种选择,您可以考虑更快地加载页面,然后触发一个AJAX请求到另一个处理程序,该处理程序将执行远程请求并返回结果。在这种情况下,初始请求页将加载得更快,而不是冻结,但是结果会在远程请求完成处理后出现。

但是,在这两种情况下,我都建议您利用异步页面来避免阻塞工作线程,这可能会对应用程序造成灾难性的后果,特别是由于某些原因,您正在访问的远程服务器非常缓慢。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20823810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档