我会尽量使这篇文章简短而甜蜜。
我已经创建了一个应用程序,我的公司每天使用它来呼叫大约2000个不同的电话号码(用于联系我们在美国各地部署的非常旧的设备),当我将该应用程序作为Windows应用程序(使用C#和JulMar ITAPI3包装器编写)运行时,该应用程序似乎运行得非常可靠,没有任何问题,这告诉我至少我的代码基本上是正确的……
我遇到的问题是,当我运行与Windows服务相同的代码时(创建新项目并像windows应用程序那样简单地调用电话拨号库),服务将运行一段时间(每次都会有所不同),然后最终会崩溃。我查看了事件日志,发现它是应用程序中的一个AccessViolation (0xc0000005)。我在调用tapi包装器时有一个try catch,在那里发生了异常,但catch从来没有命中,我假设它只是在应用程序可以返回到那个点之前崩溃。
因此,简而言之,Tapi应用程序在作为Windows应用程序运行时工作得很好,但当作为Windows服务运行(在本地系统下运行)时,最终会失败,并出现AccessViolation错误,该错误没有被围绕“违规”函数调用的try catch捕获到。
有什么想法吗?
这是在Windows Server 2008上运行的,如果有任何帮助的话。
编辑1:我已经尝试以几种不同类型的用户帐户运行此服务,包括本地用户帐户、域帐户、本地系统。它们都出错了。我已经从事件日志中为下面的一个失败发布了一个片段。
Application: EaglePolloutWindowsService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
Stack:
at <Module>.ATL.CComPtrBase<IUnknown>.{dtor}(ATL.CComPtrBase<IUnknown>*)
at JulMar.Tapi3.Internal.TapiBase.Compare(IUnknown*)
at JulMar.Tapi3.TTapi.FindInterface[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](IUnknown*)
at JulMar.Tapi3.TCall.CreateCallAppearance(JulMar.Tapi3.TAddress, IUnknown*)
at JulMar.Tapi3.TAddress.CreateCall(System.String, JulMar.Tapi3.LINEADDRESSTYPES, JulMar.Tapi3.TAPIMEDIATYPES)
at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.CreateNewCall(EaglePhoneLibrary.Entities.ConnectionEntity)
at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.CallTower(EaglePhoneLibrary.Entities.ConnectionEntity)
at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.ContinueIteration()
at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.ContinuePollout(EaglePhoneLibrary.Entities.ConnectionEntity)
at EaglePhoneLibrary.Logic.Outgoing.EaglePollout+<>c__DisplayClass52.<CallTower>b__4e(System.Threading.Tasks.Task)
at System.Threading.Tasks.Task+<>c__DisplayClassb.<ContinueWith>b__a(System.Object)
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
at System.Threading.Tasks.Task.ExecutionContextCallback(System.Object)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)
at System.Threading.Tasks.Task.ExecuteEntry(Boolean)
at System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()感谢大家到目前为止和未来对我们的帮助。
编辑2:我已经放弃了解决这个问题的尝试。我最好的猜测是,它源于JulMar如何处理在包装器中创建的某些COM对象的问题。我说服我的公司为TraySoft AddTapi .NET支付许可证,现在它工作得很好……
谢谢大家。
发布于 2011-11-29 06:22:08
当我们让TAPI应用程序作为服务运行时,我们总是让它们作为特定的用户运行,而不是LocalSystem,因为TAPI使用了用户特定的电话设置(拨号规则等)。
可能是TAPI正在尝试访问其中一个设置,但无法访问,因为LocalSystem的用户配置文件尚未配置。
https://stackoverflow.com/questions/8298679
复制相似问题