我们有一个使用WCF服务的C#.Net应用程序.该应用程序部署在
Windows服务应用程序的生产服务器中.该模块的一部分负责为工作人员今天工作的较小区域创建形状文件((* .shp,* .dbf),并将其发送到PDA.
要写形状文件,我们使用第三方dll,NetTopologySuite
GisSharpBlog.NetTopologySuite.IO.ShapefileWriter
这也是在C#中. (我不知道它的引用是否使用非托管代码.)
系统可能会工作正常一段时间说一个星期.突然间我们得到一个例外说法
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
sfw.Write(FileName,new GeometryCollection(gc.ToArray()));
(GeometryCollection也来自第三方dll,GeoAPI.dll)
这个错误导致了整个服务,使它无法使用.然后,我们将重新启动服务,并尝试再次运行相同的数据,它可以正常工作一周,直到再次崩溃.它只发生在生产和随机时间.我们无法找到问题的原因.
许多论坛建议这可能是因为某些非托管代码中的内存泄漏.但是我们找不到哪一个.
解决方法
根据我的经验,该消息是内存泄漏的结果.如果我处于你的情况,那么我会做的,特别是因为你正在使用第三方DLL.
1)监视您的WCF服务器,看看任务管理器中DLLHost.exe和aspnet服务发生了什么.我有一种感觉,你的第三方DLL有内存泄漏,导致这2个服务膨胀并达到您的服务器内存的限制.这就是为什么它工作一段时间,然后突然停止工作的原因.
2)确定可以回收服务器内存和应用程序池的时间表.由于这个问题是猖獗的,所以你可能会想要在午夜或者当没有人积极使用它的时候这样做.
3)编写一个很好的错误记录代码来确切知道在它陷入困境的时候发生了什么.我将在错误日志中提供以下信息:您正在传递的参数,遇到该问题的用户等.这样您就可以确切地知道发生了什么.
4)检查事件查看器可能有一些信息可以找出问题.
4)做完1,2和3之后,我会打电话给你的第三方DLL供应商,看看他们能做些什么来帮助你.您可能需要从上方提供从1,2,3和4项目收集的信息.
祝你好运,希望这将有所帮助.