IIS, Spring.Net WCF Http Управление сессиями - PullRequest
1 голос
/ 30 марта 2012

Я создаю (тонкое) клиент-серверное приложение с IIS в качестве сервера, используя Spring.Net в качестве основной технологии и тонкий клиент представления WPF, подключающийся к серверу через WCF (мы планируем веб-версию клиента в будущем ) Когда я вхожу в систему, я создаю файл cookie сеанса http, чтобы иметь полный сеанс, такой как веб-браузер, и я получаю лицензию с Сервера. Когда я выхожу из системы или по истечении времени сеанса IIS (из-за сбоя клиента или из-за неправильного выхода пользователя) мне необходимо:

  • освободить лицензию
  • освободить все объекты области сеанса из оперативной памяти сервера.

Итак, мне нужно реализовать две вещи:

  • Хук к событию EndSession для обработки таймаута и сбоев
  • Процедура выхода из системы, которая сообщает об окончании сеанса IIS после освобождения лицензии.

Я посмотрел онлайн, но не нашел четкого примера того, как сделать это двустороннее управление сеансом. Если бы вы могли помочь мне и предоставить несколько примеров конфигурации XML для IIS, Spring.Net был бы очень признателен

Кстати, это основная конфигурация WCF и WEB, представленная в моем файле web.config:

<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>

На самом деле мне удалось правильно освободить ресурсы по окончании сеанса выхода из системы или Http, реализовав IDisposable в классе BLL, который управляет сеансом пользователя и вызывается перед удалением объекта. Единственное, что я не знаю, как это сделать: когда пользователь нажимает кнопку выхода из системы после освобождения лицензии, мне нужно уничтожить http-сеанс, позволяя IIS и Spring собирать и освобождать все ресурсы сеанса, которые он выделил.

1 Ответ

1 голос
/ 02 апреля 2012

Вот как я это сделал: настроив Spring на прослушивание событий IIS в методе Logout моего сеанса, я вызываю

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

. Это, как подсказывает Andreas, запускает событие завершения сеанса, которое сообщаетПружина, что весь объект области сеанса может быть собран мусором.Мой вариант использования, который управляет пользовательским сеансом, также реализует интерфейс IDisposable, и перед освобождением объекта вызывается метод Dispose ().В этом методе я связываюсь со случаем использования Лицензии (который является одноразовым), прося его освободить лицензию.

...