码迷,mamicode.com
首页 > Web开发 > 详细

打印预览中的 ASP.NET 页面后台 sleep, 会卡住其它网络请求的解决办法

时间:2020-06-10 15:59:35      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:com   data   nbsp   move   网络   activator   end   logger   clu   

1) Web.config中<system.web> </system.web>中间增加:
    <sessionState mode="Custom" customProvider="LocklessInProcSessionStateStore" cookieless="false" timeout="1" >
      <providers>
        <add name="LocklessInProcSessionStateStore"
             type="web_admin.code.controller.LocklessInProcSessionStateStore"/>
      </providers>
    </sessionState>

 

2)增加一个class:LocklessInProcSessionStateStore

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Collections.Specialized;
using log4net;

namespace web_admin.code.controller
{
    /// <summary>
    /// 不锁定的 session ,复制自 When a Single ASP.NET Client makes Concurrent Requests for Writeable Session Variables
    /// https://www.red-gate.com/simple-talk/dotnet/asp-net/single-asp-net-client-makes-concurrent-requests-writeable-session-variables/
    ///
    /// </summary>
    public class LocklessInProcSessionStateStore : SessionStateStoreProviderBase
    {
        private SessionStateStoreProviderBase _store;

        public override void Initialize(string name, NameValueCollection config)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("Initialize(string name, NameValueCollection config) begin:" + name);

            base.Initialize(name, config);

            var storeType = typeof(SessionStateStoreProviderBase).Assembly.GetType("System.Web.SessionState.InProcSessionStateStore");
            _store = (SessionStateStoreProviderBase)Activator.CreateInstance(storeType);
            _store.Initialize(name, config);

            log.Debug("Initialize(string name, NameValueCollection config) end:" + name);
        }

        public override void Dispose()
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("Dispose begin");
            _store.Dispose();
        }

        public override bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("SetItemExpireCallback begin");
            return _store.SetItemExpireCallback(expireCallback);
        }

        public override void InitializeRequest(HttpContext context)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("InitializeRequest begin");
            _store.InitializeRequest(context);
        }

        public override SessionStateStoreData GetItem(HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId,
            out SessionStateActions actions)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("GetItem begin");

            var returnValue = _store.GetItem(context, id, out locked, out lockAge, out lockId, out actions);
            if (returnValue == null && lockId != null)
            {
                _store.ReleaseItemExclusive(context, id, lockId);
                returnValue = _store.GetItem(context, id, out locked, out lockAge, out lockId, out actions);
            }

            return returnValue;
        }

        public override SessionStateStoreData GetItemExclusive(HttpContext context, string id, out bool locked, out TimeSpan lockAge,
            out object lockId, out SessionStateActions actions)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("GetItemExclusive begin");

            var returnValue = _store.GetItemExclusive(context, id, out locked, out lockAge, out lockId, out actions);
            if (returnValue == null && lockId != null)
            {
                _store.ReleaseItemExclusive(context, id, lockId);
                returnValue = _store.GetItemExclusive(context, id, out locked, out lockAge, out lockId, out actions);
            }

            return returnValue;
        }

        public override void ReleaseItemExclusive(HttpContext context, string id, object lockId)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("ReleaseItemExclusive begin");
            _store.ReleaseItemExclusive(context, id, lockId);
        }

        public override void SetAndReleaseItemExclusive(HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("SetAndReleaseItemExclusive begin");
            _store.SetAndReleaseItemExclusive(context, id, item, lockId, newItem);
        }

        public override void RemoveItem(HttpContext context, string id, object lockId, SessionStateStoreData item)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("RemoveItem begin");
            _store.RemoveItem(context, id, lockId, item);
        }

        public override void ResetItemTimeout(HttpContext context, string id)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("ResetItemTimeout begin");
            _store.ResetItemTimeout(context, id);
        }

        public override SessionStateStoreData CreateNewStoreData(HttpContext context, int timeout)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("CreateNewStoreData begin");
            return _store.CreateNewStoreData(context, timeout);
        }

        public override void CreateUninitializedItem(HttpContext context, string id, int timeout)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("CreateUninitializedItem begin");
            _store.CreateUninitializedItem(context, id, timeout);
        }

        public override void EndRequest(HttpContext context)
        {
            ILog log = LogManager.GetLogger(typeof(LocklessInProcSessionStateStore));
            log.Debug("EndRequest begin");
            _store.EndRequest(context);
        }
    }
}

打印预览中的 ASP.NET 页面后台 sleep, 会卡住其它网络请求的解决办法

标签:com   data   nbsp   move   网络   activator   end   logger   clu   

原文地址:https://www.cnblogs.com/wkh-lhw/p/13085704.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!