带C#的异步webrequest?
你好, 我有一个简单的ASP.NET MVC网页,用户可以提交标题、描述、标签和链接(URL)。该服务的帖子由JASON(AJAX)发送,在大多数情况下都非常有效。但有时文章只是挂起,什么也没有发生,当这种情况发生时,加载此网站的任何其他页面也会变慢 webmethod非常简单,它首先将数据存储到数据库,然后使用HttpWebRequest获取URL页面。然后读取获取的页面(标题数据),在大多数情况下,它存储一个图像 我怀疑hangig是由于HttpWebRequest花费了很长时间。请求方法从以下内容开始:带C#的异步webrequest?,c#,asp.net,asp.net-mvc,httpwebrequest,C#,Asp.net,Asp.net Mvc,Httpwebrequest,你好, 我有一个简单的ASP.NET MVC网页,用户可以提交标题、描述、标签和链接(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网页之前,用户可能会被重定向到post页面。例如,如果您使用的是web api,则可以将api控制器操作更改为异步。 如果这样做,在任务完成之前,响应不会返回到客户端,但它也不会阻止其他客户端/线程 范例
[HttpPost]
public async Task<HttpResponseMessage> Post([FromBody]MyObject obj)
[HttpPost]
公共异步任务Post([FromBody]MyObject obj)
在该方法中,您还应该使用异步等待模式来创建自定义请求
关于如何构建异步web API的更多信息,请阅读一些文章
也许看看我不清楚问题出在哪里。“可能更好”在什么方面更好?你的代码现在运行吗?你想改进什么?正如我所说的“有时帖子只是挂起,当这种情况发生时什么也没有发生,加载这个网站的任何其他页面也会变慢。”我确信这与webrequest代码有关。所以你的问题是“为什么这个帖子挂起以及如何修复它?”。这里没有可以找到问题的信息。远程服务器只是没有响应吗?在这种情况下,请修复服务器。使用Fiddler来找出问题所在。这就是问题所在,它并不总是存在,而且我还无法在自己的服务器上手动重新创建问题。这只发生在主办方,但也有更多的交通。由于所有其他操作都很简单,我确信问题出在我发布的代码中。更好的方法可能是异步webrequest,但我也不确定这是否能解决问题。我使用Elmah记录异常,但这不会引发任何异常,它只是挂起并使所有其他调用变慢。Async也会等待,或者在发送响应时不会得到结果。这两种情况都可能是您无法接受的。尝试用最少的代码行创建一个小的复制案例。可能在循环中请求URL,直到它“挂起”。你能解释一下吗?也许你有一篇文章要读更多关于这个的?当然,添加了一些链接到答案