在asp.net中响应用户请求时如何避免阻塞IO操作

时间:2012-06-29 09:10:16

标签: asp.net wcf performance

我正在研究由asp.net/IIS托管的WCF项目。此WCF服务有一个名为SearchImage的方法,如下所示:

string SearchImage(string query)
{
  //call bing service to get the images
  //it is very time-consuming
  return result.
}

对bing服务的调用非常耗时。这可能会对服务产生很大影响。异步调用在这里没有帮助:

string SearchImage(string query)
{
  //async call bing service to get the images
  WaitForComplete();
  return result.
}

你可以看到,我仍然需要等到bing返回结果。

我的问题是,是否有任何技术可以避免这种块IO问题?理想情况下,我想告诉asp.net在bing结果返回时做出响应。

2 个答案:

答案 0 :(得分:0)

没有。你需要做的是返回一个完整的网页,嵌入了javascript(jquery很流行,虽然atlas可以更好地与asp.net集成),它将在页面呈现后执行异步调用,然后替换相关的DOM部分(通常用CSS id标记)包含您加载的内容。这样,用户可以看到所有已加载的内容,但会被最终文本,图像或其准备好后正在加载的任何内容所取代。

您可以将异步呼叫转到您的服务器,以便您可以进行额外的按摩服务器端,但这很少值得付出努力。 Javascript几乎可以处理您需要的任何按摩。

答案 1 :(得分:0)

我曾经参与过一个项目,我需要通过递归导航到所有内部链接来解析网站结构。我使用普通的ASP.NET应用程序作为前端和WCF服务(不记得它是在IIS中还是作为Windows服务托管)来完成实际工作。

由于遍历所有链接的过程可能需要很长时间才能完成(而且我需要定期通知用户进度)我实现了异步服务操作(MSDN reference)以执行实际解析(是称为服务器端)和用于汇​​集任务状态的同步(使用AJAX定期称为客户端)。

此SO问题包含有关主题的一些有用链接:How to make a call to my WCF service asynchronous?

希望这会对你有所帮助。