((System.Web.IHttpHandler)instance).ProcessRequest(reference to spawn's HTTPContext);
不要担心ASP.Net似乎是发送用户7个响应1请求,该部分被处理,只有一个响应被发送.
问题在于,在高流量环境(我们的生产环境)中有许多线程(四分之一)),我们会发现错误:
06001
我们不能在其他地方复制.我的同事认为这是因为我正在重用原始的HTTPContext并将其传递给其他线程,而且它不是线程安全的.
按照这个逻辑,我已经尝试使一个新的HTTPContext进入线程.但它的一部分似乎不会“结合”.具体来说,我需要将Session对象转换成新的HTTPContext.我想我想要得到其他部分,像缓存.对于记录HTTPContext.Current.Session.IsSynchronized为false.
我的问题是:
>你认为这个错误是从跨线程使用HTTPContext吗?
>如何解决?
>如果修复是复制每个线程的HTTPContext,我该如何获得新的Session(和缓存)?请求和响应进入ctor,但会话不可设置.
编辑:更多细节
所以回到这个声明:“不要担心ASP.Net似乎是发送用户7个响应1请求,只有一个响应被发送.”雷蒙德陈的巨大粉丝,我同意你的看法:“现在你有两个问题”是没有任何更多信息的合理的声明.
实际发生的是我正在构建一个要发回的Excel文档.在spawn.aspx页面中,它设置了一些状态信息,包括将其渲染为excel的事实,以及要执行渲染的对象.每个生成的页面都会获取该信息,并且将阻止它们轮到渲染到该对象.如果字面上看起来像这样:
protected override void Render(System.Web.UI.HtmlTextWriter writer) { if (this.RenderToExcel) { Deadlocker.SpinUntilCurrent(DeadLockToken); RenderReport(this,this.XLSWriter); Deadlocker.Remove(DeadLockToken); } else base.Render(writer); }
但是到目前为止所有的处理 – 数据库访问,控制权力,所有这些都是并行完成的.而且还有很多 – 足够让它变得模棱两可,而仍然让它阻挡在渲染上会将整个时间缩短一半以上.
而最好的部分是 – 没有什么必须重写为Excel渲染.所有控件都知道如何使自己成为excel,而且您可以独立访问每个生成的页面(实际上是“正常情况”) – excel报告只是所有生成页面的聚合.)
所以我认为最终的结果将是“你不能这样做,你需要重新思考这种方法” – 但是我至少要尝试一下,因为事实上一切都很好,没有重复任何逻辑或任何代码或必须抽象任何东西才是完美的.它只是多线程的问题,如果我连续渲染页面一切都很好,只是缓慢.
解决方法
本质上问题在于你正在做一些不想要的事情,这些请求一般是多个,每个都有自己分配的HttpApplication来满足请求,每个都有自己的HttpContext.
我真的会尝试让asp.net基础架构委托请求本身.