我有一个运行在IIS 6.0上的WCF服务(使用.NET Framework 3.5构建)。
代码流程如下:
- 客户端(另一个Web服务)调用WCF服务
- WCF服务调用线程在后台处理并立即响应调用者。
- 后台线程完成所有处理后,回调该线程。此调用基本上是一个HTTPs请求,因为客户端是Web服务。
我正在对我的WCF服务进行负载测试以定义阈值。观察结果如下:
在1分钟内对WCF服务进行了大约3次1024个请求的迭代,全部通过。完成每次迭代所需的时间大约为25-30分钟。但是从第4次迭代开始,出现了大量失败。大约50%的请求失败,异常信息如下:
Exception-Thread was being aborted.
堆栈跟踪:
21_10_2016_09_30_52,9:30:52 AM,Information,Thread name- apSwTTbLTETfwT3y Stack trace in ProcessTestConversion method - at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext)
at System.Net.LazyAsyncResult.WaitForCompletion(Boolean snap)
at System.Net.Connection.SubmitRequest(HttpWebRequest request, Boolean forcedsubmit)
at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName)
at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint)
at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
.
.(My function calls stack trace)
.
.
我尝试解决这些问题的更改如下: <behavior>
<serviceThrottling maxConcurrentCalls="2000"
maxConcurrentInstances ="2400"
maxConcurrentSessions ="400"/>
</behavior>
在 web.config 文件中
<system.web>
<compilation debug="false" />
<httpRuntime executionTimeout="1800"/>
</system.web>
在 web.config 中
<system.net>
<connectionManagement>
<add address = "*" maxconnection = "100" />
</connectionManagement>
</system.net>
在web.config中
ServicePointManager.DefaultConnectionLimit = 100; (Change in code)
我已按StackOverflow上许多人的建议将App池的IdleTimeout属性设置为0。
无论何时使用流,我都在所有位置处进行了处理。因此,所有流都已关闭。
有谁能告诉我是谁在中止线程以及为什么会这样做,是否有任何工具或方法可以跟踪线程中止的原因?