Я создаю (тонкое) клиент-серверное приложение с 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 собирать и освобождать все ресурсы сеанса, которые он выделил.