我一直在试图追查一个ASP .NET会话状态保持locking的状态的根本原因,因为一个意外的错误终止了Web请求。 我们使用SQL Server会话状态提供程序进行会话,因为我们在Web场中有多个服务器。 这个问题首先以许多请求的forms出现,没有明显的原因,这些请求被卡在生命周期的“AcquireRequestState”事件中。 我能够在SQL服务器的会话状态数据库中find相应的条目,这些条目都是locking的(列locking= 1)。 我还能够将这些请求与HTTP状态码为500(子状态为0)的IIS日志中的条目关联起来。 这些发现使我相信,在某些情况下,一个请求正在出错,但不会像应该的那样释放对会话状态的locking。
我在IIS中为状态码为500的网站启用了“失败的请求追踪”,其中所有可用的提供者都select了详细的“详细”设置。 自从我收集了几个导致永久lockingASP .NET会话的失败痕迹。 它们都具有相同的特征:
这里的问题是,在正常情况下,应该有一个RELEASE_REQUEST_STATE事件,它允许会话模块释放它在会话上的locking。 在这种情况下,此事件将被跳过。 可以肯定的是,我还启用了“200”状态代码的失败请求跟踪,并生成了几个成功请求的跟踪,这些请求确实通过Session模块处理了RELEASE_REQUEST_STATE事件。
我的理论在这一点是某种networking问题导致'不正确的function'和'I / O操作已被中止由于线程退出或应用程序请求'的错误,但我不明白为什么这似乎导致请求处理跳过RELEASE_REQUEST_STATE事件。 如果请求经历了REQUEST_ACQUIRE_STATE,那么它也应该也是RELEASE_REQUEST_STATE。 我不喜欢说这是IIS或ASP .NET中的一个错误,但是在这一点上它肯定会出现这种情况。
是否有任何configuration更改,可以帮助确保在所有错误情况下触发“RELEASE_REQUEST_STATE”?