【发布时间】:2012-04-13 21:08:54
【问题描述】:
我正在构建一个(瘦)客户端-服务器应用程序,以 IIS 作为服务器,使用 Spring.Net 作为主要技术,以及一个通过 WCF 与服务器通信的瘦 WPF 演示客户端(我们计划将来使用客户端的 Web 版本) 当我登录时,我创建了一个 http 会话 cookie 来拥有一个像 Web 浏览器一样的有状态会话,并且我从服务器获得了许可证。 当我注销或 IIS 会话超时(因为客户端崩溃或用户无法正确注销)时,我需要:
- 释放许可证
- 从服务器 RAM 中释放所有会话范围的对象。
所以我需要实现这两件事:
- EndSession 事件的挂钩以处理超时和崩溃
- 释放许可证后将会话结束通知 IIS 的注销过程。
我在网上查看过,但没有找到关于如何进行这种双向会话管理的明确示例。如果您能帮助我并提供一些 IIS 的 xml 配置示例,Spring.Net 将不胜感激
仅供参考,这是我的 web.config 文件中的主要 WCF 和 WEB 配置:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<bindings>
<basicHttpBinding>
<binding name="basicHttpBinding1" maxReceivedMessageSize="31457280" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:30:00" sendTimeout="00:30:00">
<readerQuotas maxStringContentLength="31457280" maxArrayLength="31457280" />
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="wcfService" behaviorConfiguration="DefaultBehavior">
<endpoint address="" binding="basicHttpBinding" contract="Nemsys.SMF.Service.Tunnel.IWCFService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceMetadata httpGetEnabled="True" />
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<sessionState timeout="60" />
<!-- needed by Spring.Net on IIS 7.0 -->
<httpHandlers>
<add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web" />
</httpHandlers>
<httpModules>
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web" />
</httpModules>
</system.web>
<!-- needed by Spring.Net on IIS 7.0 -->
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules>
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web" />
</modules>
<handlers>
<add name="SpringPageHandler" verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web" />
<add name="SpringContextMonitor" verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web" />
</handlers>
</system.webServer>
实际上,通过在管理用户会话并在释放对象之前调用的 BLL 类中实现 IDisposable,我已经成功地在注销或 Http 会话到期时正确释放资源。 我唯一不知道该怎么做的是: 当用户在释放许可证后单击注销按钮时,我需要销毁 http 会话,让 IIS 和 Spring 收集并释放它们分配的所有会话资源。
【问题讨论】:
-
恕我直言,这与 spring.net 无关。如果您在 IIS 上并使用 asp.net 会话,则可以创建 global.asax 并使用
protected void Session_End(Object sender, EventArgs e)进行清理。 -
根据你的更新
SessionState.Abandon();是你的朋友。 msdn.microsoft.com/en-us/library/…
标签: wcf session iis spring.net session-timeout