背景:
有一个asp.net网站(简称为A网站),基于net frameworkd1.1,form认证方式,有个功能页面是显示合同
系统集成的需要,其他系统希望调用一个web服务,拿到合同数据后进行打印实现方案:
保持A网站不变,用c#创建了一个web服务(简称B服务),基于net framework4.0,内部使用HttpWebRequest实现了模拟登陆,拿到了身份认证cookie,然后调用合同页面,传入身份认证cookie,获取输出流,转换成pdf字节码输出。
模拟登陆内含两个步骤:1.访问登陆页面,解析返回,获取隐藏字段_viewstate的值 2.再次访问登陆页面,完成登陆,拿到身份认证cookie。因此一个打印合同的接口调用,B服务实际会进行三次请求(取viewstate,模拟登陆、请求合同页面),总耗时约6-8秒,进行优化,缓存了身份认证cookie,首次登陆耗时较长,以后登陆,跳过了模拟登陆,直接请求合同页面,只需要1-2秒。存在问题:
实际测试发现,开始一段时间内,B服务运行正常,但是每间隔半小时,身份认证会失效,自动跳转到登陆页面,导致需要重新进行身份认证过程,也就是每隔半小时,会有一次接口调用需要6-8秒,耗时太长,影响用户体验(打印服务在自助设备上)。查了A网站Web.config,是默认的20分钟会话超时时间。会话失效时间非常规律,每隔半小时(自己写个小程序,定时调用,测试结果可靠)。疑问
对这个问题非常疑惑,对于A网站,用户登陆后,会话超时时间是20分钟,20分钟以内,若用户有请求,如点击按钮,刷新页面,则会话时间会延长,实际超时时间是从用户无操作时开始计算20分钟。B接口服务,首次访问模拟登陆后再缓存身份认证cookie,以1分钟的时间间隔去频繁调用合同功能页面,正常情况下不应该出现半小时会话失效的现象。推测
使用httpWebRequest方式,与用户使用浏览器进行真实操作,实际上还是有差异,但这种差异在哪,哪位清楚?求助
哪位有这方面的经验?如何才能实现保持会话一直有效?

解决方案 »

  1.   

    用ASP.NET状态服务可靠点,或者用数据库。
      

  2.   

    cookie本身可以带有效时间的.
    另外,可以自己记录一下登录时间, 在达到失效时间之前重新登录.
      

  3.   

    web服务器系统(例如IIS)本身可以设置许多种“系统回收资源”的参数,例如每隔30分钟回收,每当网站内存占用达到 10%回收,每当连接数达到300时回收........不是只有所谓的 web.config 这一个设置的。
      

  4.   

    asp.net 应用以及 IIS 等系统会自动维护、重启 asp.net 进程,(特别是在突然变得繁忙、资源紧张时,或者特定功能使用了几百次以后)有无数种原因会随时重启、自我维护。开发编程中不应该想当然地仅仅知道什么“web.cofnig”这一点点设置。既然你“查了A网站Web.config”,那么实际上你们应该绕开这个 asp.net 原有的机制来访问(而应该直截了当地重建一个服务系统),或者是修改它使得它根本不使用坑爹的 Session 集合。这样才是长久的。