Sch*_*ini 8 .net asp.net iis unmanaged command-line-interface
我们在.net项目中引用了第三方专有的CLI DLL.此DLL只是其专有C++库的接口.我们的项目是一个asp.net(MVC4/Web API)Web应用程序.
C++非托管库相当不稳定.有时它会像悬空指针一样崩溃.我们无法解决它,使用此库是一流的客户要求.
当应用程序崩溃时,IIS中的应用程序池不再响应.我们必须重新启动它,这样做需要几分钟(是的,那么久!).
我们希望保持这个不稳定的DLL不会崩溃我们的应用程序.这样做的最佳方式是什么?我们可以将CLI DLL保存在单独的AppDomain中吗?怎么样?
提前致谢.
小智 6
我认为这个问题的每个答案都将是某种解决方法.
我的解决方法是不与Web应用程序中的DLL直接交互.
而是将您的请求从Web应用程序写入Message Queue或SQL表.然后,您可以使用其他应用程序(如Windows服务)读取请求,与DLL交互,然后将结果写回Web应用程序以进行读取.
我不是说SQL /消息队列是正确的方法,我更多的是考虑一般的流程.
我会首先提高IIS进程的回收率,也许DLL代码在调用一定次数后失败,或者进程达到一定的内存使用量后。
您可以在此处找到有关 IIS 7.0 回收选项配置的信息:http://technet.microsoft.com/en-us/library/cc753179 (v=ws.10).aspx
在您的情况下,当您知道应用程序上的负载较少时,我会在特定时间回收该进程。在收到一定数量的请求(低于默认值)后,大多数时间都会尝试进行“新鲜”处理。
回收过程是优雅的,因为旧的进程在替换它的进程准备就绪之前不会终止,因此不应该有明显的停机时间。有关回收机制的更多信息,请访问:http://technet.microsoft.com/en-us/library/cc745955.aspx
如果上述方法不能解决问题,我会将这些调用包装在我自己的代码中,以管理不稳定的 DLL 执行。
该代码应该从失败中恢复,例如通过重复失败的调用直到获得结果,如果在多次尝试后仍然不可能,则失败并出现正常错误。
在内部,对不稳定 DLL 的调用可以在生成的线程中进行,甚至代码可以位于可以使用 Process.Start 启动的新的外部可执行文件中。
最后一个选项的开销更大,但它可能是您唯一的选择。有关此问题的更多信息,请参阅此问题:如何处理具有挂起调用的线程?
| 归档时间: |
|
| 查看次数: |
618 次 |
| 最近记录: |