C# ObjectDataSource调用WCF服务抛出无法访问dispose对象
在Windows Server 2012的IIS上部署程序时,我遇到程序抛出无法访问dispose对象 根据代码,代码可以在我的PC开发和生产中正常运行,但在部署到测试服务器时出现问题 症状是我可以在部署后第一次很好地运行程序,然后当我重新进入它抛出的页面时无法访问处置对象 我还使用soap反复检查服务以发送请求,但没有发现问题,现在在不同的PC和服务器上测试后,它也可以运行 我不确定在配置或服务器规范方面我还需要做些什么。 因为其他可以运行的服务器的ram超过8GB,但在发现问题的测试服务器中只有4GB的ram,或者我必须编辑我的代码 将数据源绑定到服务的代码部分C# ObjectDataSource调用WCF服务抛出无法访问dispose对象,c#,iis,autofac,telerik-reporting,C#,Iis,Autofac,Telerik Reporting,在Windows Server 2012的IIS上部署程序时,我遇到程序抛出无法访问dispose对象 根据代码,代码可以在我的PC开发和生产中正常运行,但在部署到测试服务器时出现问题 症状是我可以在部署后第一次很好地运行程序,然后当我重新进入它抛出的页面时无法访问处置对象 我还使用soap反复检查服务以发送请求,但没有发现问题,现在在不同的PC和服务器上测试后,它也可以运行 我不确定在配置或服务器规范方面我还需要做些什么。 因为其他可以运行的服务器的ram超过8GB,但在发现问题的测试服务器中
#region Employeeprofile
this.EmployeeProfileDataSource.DataMember = "GetWF_30EmployeeProfile";
this.EmployeeProfileDataSource.DataSource = typeof(THP.Welfare.Reporting.ReportManager.EmployeeProfilesReportManager);
this.EmployeeProfileDataSource.Name = "EmployeeProfileDataSource";
this.EmployeeProfileDataSource.Parameters.AddRange(new Telerik.Reporting.ObjectDataSourceParameter[] {
new Telerik.Reporting.ObjectDataSourceParameter("employeeNo", typeof(string), empNo)});
report.DataSource = this.EmployeeProfileDataSource;
#endregion
#region Spouse
this.SpouseDataSource.DataMember = "GetWF_30SummaryMarriageFromBeforeApprove";
this.SpouseDataSource.DataSource = typeof(THP.Welfare.Reporting.ReportManager.EmployeeProfilesReportManager);
this.SpouseDataSource.Name = "SpouseDataSource";
this.SpouseDataSource.Parameters.AddRange(new Telerik.Reporting.ObjectDataSourceParameter[] {
new Telerik.Reporting.ObjectDataSourceParameter("employeeNo", typeof(string), empNo)});
然后,EmployeeProfilesReportManager启动服务并呼叫
public EmployeeProfilesReportManager()
{
_service =Autofac.Integration.Mvc.AutofacDependencyResolver.Current.GetService<IService.IReportEmployeeProfileService>();
_logExceptionService = Autofac.Integration.Mvc.AutofacDependencyResolver.Current.GetService<IService.ILogException>();
}
我希望有问题的服务器可以像其他服务器一样正常运行。
多谢各位
使用诊断工具后,我得到了以下信息
DetailID = 18
Count: 1
Type: System.ObjectDisposedException
Message: Cannot access a disposed object.
Stack:
[HelperMethodFrame]
System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrImmutable()
System.ServiceModel.Channels.CommunicationObject.Open(System.TimeSpan)
System.ServiceModel.Channels.ServiceChannel+CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(System.ServiceModel.Channels.ServiceChannel, System.TimeSpan)
System.ServiceModel.Channels.ServiceChannel+CallOnceManager.CallOnce(System.TimeSpan, CallOnceManager)
System.ServiceModel.Channels.ServiceChannel.EnsureOpened(System.TimeSpan)
System.ServiceModel.Channels.ServiceChannel.Call(System.String, Boolean, System.ServiceModel.Dispatcher.ProxyOperationRuntime, System.Object[], System.Object[], System.TimeSpan)
System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(System.Runtime.Remoting.Messaging.IMethodCallMessage, System.ServiceModel.Dispatcher.ProxyOperationRuntime)
System.ServiceModel.Channels.ServiceChannelProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage)
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(System.Runtime.Remoting.Proxies.MessageData ByRef, Int32)
[TPMethodFrame]
THP.Welfare.Reporting.ReportManager.EmployeeProfilesReportManager.GetWF_30EmployeeProfile(System.String)
[DebuggerU2MCatchHandlerFrame]
[HelperMethodFrame_PROTECTOBJ]
System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[])
System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].TryResolveDataSourceInstance(Boolean, System.Object ByRef, System.String ByRef)
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].ResolveDataSource(Boolean)
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].ResolveDataSource()
Telerik.Reporting.Processing.Data.ObjectDataEnumerable.GetEnumerator()
Telerik.Reporting.Processing.Data.ResultSetAdapter.Fill(Telerik.Reporting.Processing.Data.ResultSet, System.Collections.Generic.IEnumerable`1<Telerik.Reporting.Processing.IDataObject>)
Telerik.Reporting.Processing.Data.MultidimentionalDataProvider.Execute(Telerik.Reporting.Processing.Data.MultidimensionalQuery)
Telerik.Reporting.Processing.Report.ResolveData()
Telerik.Reporting.Processing.Report.ProcessItemCore()
Telerik.Reporting.Processing.Report.ProcessItem()
Telerik.Reporting.Processing.ReportItemBase.ProcessElement()
Telerik.Reporting.Processing.ProcessingElement.Process(Telerik.Reporting.Processing.Data.IDataMember)
Telerik.Reporting.Processing.ReportProcessor.ProcessReport(Telerik.Reporting.ReportSource, Telerik.Reporting.Processing.IRenderingContext)
Telerik.Reporting.Processing.ReportProcessor.ProcessReport(Telerik.Reporting.ReportSource, System.Collections.Hashtable, Telerik.Reporting.Processing.IRenderingContext)
Telerik.Reporting.Services.Engine.ReportRenderer.Render(Telerik.Reporting.Services.Engine.ReportRendererArgs)
Telerik.Reporting.Services.Engine.Rendering.RenderWithCulture(Telerik.Reporting.Services.Engine.ReportRendererArgs)
Telerik.Reporting.Services.Engine.Rendering.ThreadFunc(System.Object)
System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
System.Threading.ThreadHelper.ThreadStart(System.Object)
[GCFrame]
[DebuggerU2MCatchHandlerFrame]
[ContextTransitionFrame]
[DebuggerU2MCatchHandlerFrame]
DetailID = 19
Count: 1
Type: System.ObjectDisposedException
Message: Cannot access a disposed object.
Stack:
[HelperMethodFrame]
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Messaging.IMessage)
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(System.Runtime.Remoting.Proxies.MessageData ByRef, Int32)
[TPMethodFrame]
THP.Welfare.Reporting.ReportManager.EmployeeProfilesReportManager.GetWF_30EmployeeProfile(System.String)
[DebuggerU2MCatchHandlerFrame]
[HelperMethodFrame_PROTECTOBJ]
System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[])
System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].TryResolveDataSourceInstance(Boolean, System.Object ByRef, System.String ByRef)
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].ResolveDataSource(Boolean)
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].ResolveDataSource()
Telerik.Reporting.Processing.Data.ObjectDataEnumerable.GetEnumerator()
Telerik.Reporting.Processing.Data.ResultSetAdapter.Fill(Telerik.Reporting.Processing.Data.ResultSet, System.Collections.Generic.IEnumerable`1<Telerik.Reporting.Processing.IDataObject>)
Telerik.Reporting.Processing.Data.MultidimentionalDataProvider.Execute(Telerik.Reporting.Processing.Data.MultidimensionalQuery)
Telerik.Reporting.Processing.Report.ResolveData()
Telerik.Reporting.Processing.Report.ProcessItemCore()
Telerik.Reporting.Processing.Report.ProcessItem()
Telerik.Reporting.Processing.ReportItemBase.ProcessElement()
Telerik.Reporting.Processing.ProcessingElement.Process(Telerik.Reporting.Processing.Data.IDataMember)
Telerik.Reporting.Processing.ReportProcessor.ProcessReport(Telerik.Reporting.ReportSource, Telerik.Reporting.Processing.IRenderingContext)
Telerik.Reporting.Processing.ReportProcessor.ProcessReport(Telerik.Reporting.ReportSource, System.Collections.Hashtable, Telerik.Reporting.Processing.IRenderingContext)
Telerik.Reporting.Services.Engine.ReportRenderer.Render(Telerik.Reporting.Services.Engine.ReportRendererArgs)
Telerik.Reporting.Services.Engine.Rendering.RenderWithCulture(Telerik.Reporting.Services.Engine.ReportRendererArgs)
Telerik.Reporting.Services.Engine.Rendering.ThreadFunc(System.Object)
System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
System.Threading.ThreadHelper.ThreadStart(System.Object)
[GCFrame]
[DebuggerU2MCatchHandlerFrame]
[ContextTransitionFrame]
[DebuggerU2MCatchHandlerFrame]
这是来自分析工具
Thread 24 - System ID 3404
Entry point clr!LogHelp_LogAssert+18208
Create time 5/9/2562 19:21:15
Time spent in user mode 0 Days 00:00:00.015
Time spent in kernel mode 0 Days 00:00:00.000
This thread is not fully resolved and may or may not be a problem. Further analysis of these threads may be required.
The thread has evidence of .net exceptions on the stack. Check the Previous .NET Exceptions Report (Exceptions in all .NET Thread Stacks) to view more details of the associated exception
.NET Call Stack
[[HelperMethodFrame]]
System_ServiceModel_ni!System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrImmutable()+15a
System_ServiceModel_ni!System.ServiceModel.Channels.CommunicationObject.Open(System.TimeSpan)+b8
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannel+CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(System.ServiceModel.Channels.ServiceChannel, System.TimeSpan)+12
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannel+CallOnceManager.CallOnce(System.TimeSpan, CallOnceManager)+10d
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannel.EnsureOpened(System.TimeSpan)+28
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannel.Call(System.String, Boolean, System.ServiceModel.Dispatcher.ProxyOperationRuntime, System.Object[], System.Object[], System.TimeSpan)+1af
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(System.Runtime.Remoting.Messaging.IMethodCallMessage, System.ServiceModel.Dispatcher.ProxyOperationRuntime)+61
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannelProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage)+90
mscorlib_ni!System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(System.Runtime.Remoting.Proxies.MessageData ByRef, Int32)+114
[[TPMethodFrame] (THP.Welfare.IService.IReportEmployeeProfileService.GetWF_30EmployeeProfiles)] THP.Welfare.IService.IReportEmployeeProfileService.GetWF_30EmployeeProfiles(System.String)
THP.Welfare.Reporting.ReportManager.EmployeeProfilesReportManager.GetWF_30EmployeeProfile(System.String)+59
[[DebuggerU2MCatchHandlerFrame]]
[[HelperMethodFrame_PROTECTOBJ] (System.RuntimeMethodHandle.InvokeMethod)] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)
mscorlib_ni!System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[])+80
mscorlib_ni!System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)+92
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].TryResolveDataSourceInstance(Boolean, System.Object ByRef, System.String ByRef)+2ec
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].ResolveDataSource(Boolean)+2c
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].ResolveDataSource()+23
Telerik.Reporting.Processing.Data.ObjectDataEnumerable.GetEnumerator()+1d
Telerik.Reporting.Processing.Data.ResultSetAdapter.Fill(Telerik.Reporting.Processing.Data.ResultSet, System.Collections.Generic.IEnumerable`1)+249
Telerik.Reporting.Processing.Data.MultidimentionalDataProvider.Execute(Telerik.Reporting.Processing.Data.MultidimensionalQuery)+af
Telerik.Reporting.Processing.Report.ResolveData()+256
Telerik.Reporting.Processing.Report.ProcessItemCore()+68
Telerik.Reporting.Processing.Report.ProcessItem()+a0
Telerik.Reporting.Processing.ReportItemBase.ProcessElement()+27
Telerik.Reporting.Processing.ProcessingElement.Process(Telerik.Reporting.Processing.Data.IDataMember)+c4
Telerik.Reporting.Processing.ReportProcessor.ProcessReport(Telerik.Reporting.ReportSource, Telerik.Reporting.Processing.IRenderingContext)+590
Telerik.Reporting.Processing.ReportProcessor.ProcessReport(Telerik.Reporting.ReportSource, System.Collections.Hashtable, Telerik.Reporting.Processing.IRenderingContext)+1d0
Telerik.Reporting.Services.Engine.ReportRenderer.Render(Telerik.Reporting.Services.Engine.ReportRendererArgs)+bc
Telerik.Reporting.Services.Engine.Rendering.RenderWithCulture(Telerik.Reporting.Services.Engine.ReportRendererArgs)+51
Telerik.Reporting.Services.Engine.Rendering.ThreadFunc(System.Object)+5a
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+160
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+17
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)+52
mscorlib_ni!System.Threading.ThreadHelper.ThreadStart(System.Object)+5d
[[GCFrame]]
[[DebuggerU2MCatchHandlerFrame]]
[[ContextTransitionFrame]]
[[DebuggerU2MCatchHandlerFrame]]
Full Call Stack
KERNELBASE!RaiseException+6c
clr!LogHelp_LogAssert+16565
clr!LogHelp_LogAssert+16363
[[HelperMethodFrame]]
System_ServiceModel_ni!System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrImmutable()+15a
System_ServiceModel_ni!System.ServiceModel.Channels.CommunicationObject.Open(System.TimeSpan)+b8
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannel+CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(System.ServiceModel.Channels.ServiceChannel, System.TimeSpan)+12
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannel+CallOnceManager.CallOnce(System.TimeSpan, CallOnceManager)+10d
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannel.EnsureOpened(System.TimeSpan)+28
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannel.Call(System.String, Boolean, System.ServiceModel.Dispatcher.ProxyOperationRuntime, System.Object[], System.Object[], System.TimeSpan)+1af
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(System.Runtime.Remoting.Messaging.IMethodCallMessage, System.ServiceModel.Dispatcher.ProxyOperationRuntime)+61
System_ServiceModel_ni!System.ServiceModel.Channels.ServiceChannelProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage)+90
mscorlib_ni!System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(System.Runtime.Remoting.Proxies.MessageData ByRef, Int32)+114
clr!GetMetaDataInternalInterface+1e30e
clr!GetMetaDataPublicInterfaceFromInternal+2a8f1
clr!PreBindAssemblyEx+1b12d
[[TPMethodFrame] (THP.Welfare.IService.IReportEmployeeProfileService.GetWF_30EmployeeProfiles)] THP.Welfare.IService.IReportEmployeeProfileService.GetWF_30EmployeeProfiles(System.String)
clr!GetMetaDataInternalInterface+1e251
THP.Welfare.Reporting.ReportManager.EmployeeProfilesReportManager.GetWF_30EmployeeProfile(System.String)+59
clr+3753
clr+361c
clr!GetMetaDataInternalInterface+31766
clr!GetMetaDataInternalInterface+31550
[[DebuggerU2MCatchHandlerFrame]]
[[HelperMethodFrame_PROTECTOBJ] (System.RuntimeMethodHandle.InvokeMethod)] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean)
mscorlib_ni!System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(System.Object, System.Object[], System.Object[])+80
mscorlib_ni!System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)+92
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].TryResolveDataSourceInstance(Boolean, System.Object ByRef, System.String ByRef)+2ec
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].ResolveDataSource(Boolean)+2c
Telerik.Reporting.Processing.Data.ObjectDataProviderBase`1[[System.__Canon, mscorlib]].ResolveDataSource()+23
Telerik.Reporting.Processing.Data.ObjectDataEnumerable.GetEnumerator()+1d
Telerik.Reporting.Processing.Data.ResultSetAdapter.Fill(Telerik.Reporting.Processing.Data.ResultSet, System.Collections.Generic.IEnumerable`1<Telerik.Reporting.Processing.IDataObject>)+249
Telerik.Reporting.Processing.Data.MultidimentionalDataProvider.Execute(Telerik.Reporting.Processing.Data.MultidimensionalQuery)+af
Telerik.Reporting.Processing.Report.ResolveData()+256
Telerik.Reporting.Processing.Report.ProcessItemCore()+68
Telerik.Reporting.Processing.Report.ProcessItem()+a0
Telerik.Reporting.Processing.ReportItemBase.ProcessElement()+27
Telerik.Reporting.Processing.ProcessingElement.Process(Telerik.Reporting.Processing.Data.IDataMember)+c4
Telerik.Reporting.Processing.ReportProcessor.ProcessReport(Telerik.Reporting.ReportSource, Telerik.Reporting.Processing.IRenderingContext)+590
Telerik.Reporting.Processing.ReportProcessor.ProcessReport(Telerik.Reporting.ReportSource, System.Collections.Hashtable, Telerik.Reporting.Processing.IRenderingContext)+1d0
Telerik.Reporting.Services.Engine.ReportRenderer.Render(Telerik.Reporting.Services.Engine.ReportRendererArgs)+bc
Telerik.Reporting.Services.Engine.Rendering.RenderWithCulture(Telerik.Reporting.Services.Engine.ReportRendererArgs)+51
Telerik.Reporting.Services.Engine.Rendering.ThreadFunc(System.Object)+5a
mscorlib_ni!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+160
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+17
mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)+52
mscorlib_ni!System.Threading.ThreadHelper.ThreadStart(System.Object)+5d
clr+3753
clr+361c
clr+44d3
clr!TranslateSecurityAttributes+11f684
[[GCFrame]]
clr+6810
clr+67c0
clr+6705
[[DebuggerU2MCatchHandlerFrame]]
clr+71b0
clr+725e
[[ContextTransitionFrame]]
clr+7193
clr+67c0
clr+6705
[[DebuggerU2MCatchHandlerFrame]]
clr+6947
clr!TranslateSecurityAttributes+11f29f
clr!LogHelp_LogAssert+1827e
kernel32!BaseThreadInitThunk+22
ntdll!RtlUserThreadStart+34
Exception Information
In w3wp__ThaihealthWelfare__PID__2376__Date__09_05_2019__Time_07_21_19PM__859__First Chance System.ObjectDisposedException.dmp the assembly instruction at KERNELBASE!RaiseException in C:\Windows\System32\KERNELBASE.dll from Microsoft Corporation has caused a CLR Exception on thread 24 with the following error information:
Type: System.ObjectDisposedException
Message: Cannot access a disposed object.
This exception originated from System_ServiceModel_ni!System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrImmutable().
Module Information
Image Name: C:\Windows\assembly\NativeImages_v4.0.30319_64\System.ServiceModel\2d239193fcf663b211916bd928cfaeb1\System.ServiceModel.ni.dll Symbol Type: None
Base address: 0x00000000`00005a4d Time Stamp: Fri Nov 06 10:20:22 2015
Checksum: 0x00000000`00000000 Comments: Flavor=Retail
COM DLL: False Company Name: Microsoft Corporation
ISAPIExtension: False File Description: System.ServiceModel.dll
ISAPIFilter: False File Version: 4.6.1055.0 built by: NETFXREL2
Managed DLL: True Internal Name: System.ServiceModel.dll
VB DLL: False Legal Copyright: ? Microsoft Corporation. All rights reserved.
Loaded Image Name: System.ServiceModel.ni.dll Legal Trademarks:
Mapped Image Name: Original filename: System.ServiceModel.dll
Module name: System_ServiceModel_ni Private Build: DDBLD400
Single Threaded: False Product Name: Microsoft? .NET Framework
Module Size: 23.41 MBytes Product Version: 4.6.1055.0
Symbol File Name: System.ServiceModel.ni.dll Special Build: &
在回答了这个问题之后,现在我可以用编辑我的代码来解决这个问题
在所有我称之为服务的方法中
public List<SummaryMarriageInfoBeforeApproveModel> GetSummaryMarriageFromBeforeApprove(string employeeNo)
{
var result = _service.Value.GetSummaryMarriageFromBeforeApprove(employeeNo);
_service.Dispose();
_logExceptionService.Dispose();
return result;
}
次要免责声明:我知道Autofac,但我从未使用过Telerik reporting services引擎。但我能猜到发生了什么 您似乎有线程/争用条件 在评论中,您注意到[格式化为可读性]: 在startup.cs中,已将通道创建为singleton Registerc=>newchannelFactoryDefaultService.SingleInstance builder.Registerc=>c.Resolve.CreateChannel.UseWcfSafeRelease 我想这个是你实际使用的东西的缩写 我还看到了这个片段: 公共雇员档案报告经理 { _service=Autofac.Integration.Mvc.AutofacDependencyResolver.Current.GetService; _logExceptionService=Autofac.Integration.Mvc.AutofacDependencyResolver.Current.GetService; } 报表管理器正在使用MVC依赖项解析器上的服务位置来获取一些内容。关于MVC依赖项解析器,需要注意的重要一点是它与当前请求相关联。当当前请求结束时,请求生存期范围将与在该范围内解析的所有一次性对象一起处理。这包括WCF服务客户端之类的东西 最后,在底部发布的错误的堆栈跟踪如下所示:
Telerik.Reporting.Services.Engine.Rendering.RenderWithCulture(Telerik.Reporting.Services.Engine.ReportRendererArgs)
Telerik.Reporting.Services.Engine.Rendering.ThreadFunc(System.Object)
System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
System.Threading.ThreadHelper.ThreadStart(System.Object)
这里有一个ThreadStart调用,所以这个渲染引擎似乎在另一个线程上运行,可能是从控制器启动的,但可能与请求生命周期无关
我猜发生的是:
MVC请求启动
Autofac请求生存期启动Autofac依赖项解析器请求生存期
报表服务已设置并开始执行
构造函数运行并可以解析服务客户端
MVC请求结束
Autofac请求生存期随服务客户端一起处理
Reporting service线程尝试使用已解析但现在已释放的客户端
我们在Autofac中经常看到这一点,在Autofac中,人们尝试在web应用程序中启动后台服务或非基于请求的内容,但仍然尝试将后台服务线程与web/请求相关的依赖项解析程序和生存期范围绑定在一起
考虑到我对Telerik报告引擎了解不够,我不知道有哪些钩子允许DI进入它。老实说,我甚至不能保证这就是问题所在,但它看起来和我在其他问题中看到的一模一样
我的建议是:
不要在EmployeeProfileReportManager中使用MVC依赖项解析程序或其他类似的工具。
不是在EmployeeProfileReportManager中解析IService.IReportEmployeeProfileService,而是解析Owned。允许您控制处置。这一点很重要,因为CommonServiceLocator是从容器中解析的,如果您不自己控制处理,您将得到内存泄漏。
在EmployeeProfileReportManager中,确保在处理完服务客户端后将其处理掉。因为您使用的是Owned,所以这不会自动发生。
在startup.cs中,将创建通道作为singleton builder.Registerc=>new ChannelFactoryDefaultService.SingleInstance;builder.Registerc=>c.Resolve.CreateChannel.UseWcfSafeRelease;我认为,建议在resolve被DisposeEdit之后使用调试诊断工具为这个ObjectDisposeException捕获一个转储文件。通过转储文件,我们知道了那里发生了什么,以及如何解决这个问题。
public List<SummaryMarriageInfoBeforeApproveModel> GetSummaryMarriageFromBeforeApprove(string employeeNo)
{
var result = _service.Value.GetSummaryMarriageFromBeforeApprove(employeeNo);
_service.Dispose();
_logExceptionService.Dispose();
return result;
}
Telerik.Reporting.Services.Engine.Rendering.RenderWithCulture(Telerik.Reporting.Services.Engine.ReportRendererArgs)
Telerik.Reporting.Services.Engine.Rendering.ThreadFunc(System.Object)
System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
System.Threading.ThreadHelper.ThreadStart(System.Object)