【问题标题】:IIS, Spring.Net WCF Http Session ManagementIIS、Spring.Net WCF Http 会话管理
【发布时间】: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


【解决方案1】:

我是这样做的: 将 Spring 配置为在我调用的会话用例的 Logout 方法中侦听 IIS 事件

public void Logout()
    {
        HttpContext.Current.Session.Abandon();
    }

正如 Andreas 所建议的,这会触发结束会话事件,该事件告诉 Spring 所有会话范围的对象都可以被垃圾收集。 我管理用户会话的用例也实现了 IDisposable 接口,并且在释放对象之前调用了 Dispose() 方法。 在这种方法中,我联系了一个许可证用例(这是一个单例),要求他释放许可证。

【讨论】:

  • 这在我的调试环境中有效,但在生产环境中尝试时不会调用 Dispose() 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
相关资源
最近更新 更多