使用C#进行异步webrequest?

时间:2013-12-22 13:51:44

标签: c# asp.net asp.net-mvc httpwebrequest

您好,

我有一个简单的ASP.NET MVC C#网页,用户可以提交标题,说明,标签和链接(URL)。该服务的帖子是与JASON(AJAX)一起发送的,并且在大多数情况下都很有用。但有时候这个帖子只是挂起而没有任何反应,当发生这种情况时,加载本网站的任何其他页面的速度也会变慢。

webmethod非常简单,首先它将数据存储到数据库,然后使用HttpWebRequest获取URL页面。然后读取获取的页面(标题数据),并且在大多数情况下它存储图像。

我怀疑hangig是由于HttpWebRequest需要很长时间。请求方法以此开头:

if (url != null && url.Length > 0)
                {
                    request = (HttpWebRequest)HttpWebRequest.Create(url);

                    dirInfo.Create();

                    request.UserAgent = ConfigurationManager.AppSettings["DomainName"];
                    webresponse = (HttpWebResponse)request.BeginGetResponse( .GetResponse();
                    if (webresponse.ContentType.StartsWith("image/"))
                    {
                        using (WebClient tmpClient = new WebClient())
                        {
                            client.DownloadFile(url, postThumbnailsTemp + "\\" + fileName);
                        }

                        if (SavePostImage(postThumbnailsTemp + "\\" + fileName, postId))
                            return true;
                    }


                    if (webresponse.ContentType.StartsWith("text/html") || webresponse.ContentType.StartsWith("application/xhtml"))
                    {
                          var resultStream = webresponse.GetResponseStream();
                          doc.Load(resultStream);

问题是在这里使用异步调用是否更好?喜欢HttpWebRequest.BeginGetResponse?这意味着在读取和存储URL网页之前,用户可能会被重定向到帖子页面。

1 个答案:

答案 0 :(得分:0)

例如,如果您使用的是web api,则可以将api控制器操作更改为异步。 如果这样做,响应将不会返回到客户端,直到任务完成,但它也不会阻止其他客户端/线程!

实施例

[HttpPost]
public async Task<HttpResponseMessage> Post([FromBody]MyObject obj)

在该方法中,您还应该使用async await模式来创建自定义请求...

有一些文章可以获得有关如何构建异步Web apis的更多信息

http://blogs.msdn.com/b/webdev/archive/2013/09/18/scaffolding-asynchronous-mvc-and-web-api-controllers-for-entity-framework-6.aspx

http://www.dotnetcurry.com/showarticle.aspx?ID=948

并且可能会看this video