我正在开发一个 ASP.NET MVC web 应用程序 (C#),它是一个更大的应用程序模块(主要是基于桌面/win 服务的 - VB.NET)。目前,该应用程序对 Web 服务(作为 API 提供)进行 HTTP 调用,这是它自己的独立应用程序(也使用 MVC、VB.NET)。可能不是我会如何设计它,但它是我继承的。
我的问题是:如果我在本地 IIS 中托管 MVC 应用程序并在 IIS Express 中运行 API 项目,一切都很好。如果我将这两个项目拆分为在本地 IIS 中的单独应用程序池中运行,则一切正常。但是,如果我在 IIS 中的同一个池中运行这两个应用程序,则会遇到很多问题。即,当我调用HttpClient.GetAsync(url)时超时- 特别是在调用此 9 次以根据 ID 动态检索不同图像的页面上(每次调用 MVC 应用程序,然后调用 API )。有些电话通过了,大多数没有。
异常与取消的任务有关(超时 = 100 秒) - 但操作需要几分之一秒,因此无需超时。当它失败时,执行甚至从来没有进入 API 端的函数 - 就像 HTTP 客户端已经放弃提供任何更多的连接,或者任务正在等待 HTTP 发送请求而它从来没有。
我一直尝试将其设为异步,尝试将 HttpClient 设为静态等。但没有任何乐趣。这只是不应该做的事情 - 允许两个应用程序共享一个应用程序池吗?如果是这样,我可以忍受。但如果我能做些什么来更有效地处理它,那将非常有用。非常感谢有关此的任何信息/资源。塔!
我们最近遇到了同样的问题,花了很多时间调试才发现使用相同的应用程序池是问题的原因。
我还发现,如果您在应用程序池的高级设置中增加最大工作进程的数量,这可能会起作用。
我不确定为什么会这样,但我猜所有请求都由一个进程处理,这导致了积压,最终导致超时的请求太多。(虽然我很高兴有更了解 IIS 的人来纠正我)
HTH
编辑:在这里进一步阅读Carmelo Pulvirenti 的博客,似乎垃圾收集器可能是罪魁祸首。该博客指出,在同一个池上运行的多个应用程序共享内存,副作用是;
这意味着 GC 每秒运行大量时间,以便为您的应用程序提供干净的内存。副作用是什么?在服务器模式下,垃圾收集器需要停止所有线程活动来清理内存(这在 .NET Fx 4.5 上有所改进,其中的排序规则不需要停止所有线程)。副作用是什么?
- Web 应用程序的性能下降
- 由于 GC 的活动,对 CPU 时间的影响很大。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句