【问题标题】:How to avoid block IO operation when responding a user's request in asp.net在asp.net中响应用户请求时如何避免阻塞IO操作
【发布时间】:2012-06-29 09:10:16
【问题描述】:

我正在处理由 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 结果返回时做出响应。

【问题讨论】:

  • 你能反过来看吗?在网页上启动 AJAX,然后 AJAX 处理程序调用 WCF?这样用户就可以立即从网站获得响应,而 WCF 可以占用它需要的所有时间

标签: asp.net wcf performance


【解决方案1】:

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

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

【讨论】:

  • 但它是纯数据服务,这里不涉及javascript/网页。那么有没有办法避免block IO呢?
  • 我不确定你的意思,但如果它是 Web 服务之类的东西,不,通常你无法返回部分结果,然后在 IO 完成后转身返回更多。当然,这取决于 API,但看起来你不走运。
  • 我明白了。谢谢,看来我需要忍受它。 :-)
【解决方案2】:

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

由于遍历所有链接的过程可能需要很长时间才能完成(另外我需要定期通知用户进度)我实现了一个异步服务操作(MSDN reference)来执行实际的解析(被称为服务器-side) 和一个用于池化任务状态的同步任务(使用 AJAX 定期调用客户端)。

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

希望对你有所帮助。

【讨论】:

  • 抱歉,这仍然不相关。我的问题不在于客户端的异步调用。
猜你喜欢
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多