2012-03-30 3 views
1

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

  • релиз лицензии
  • все бесплатно сеанс области видимости объектов с сервера RAM ,

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

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

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

FYI это является основным 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 Session, позволяя IIS и Spring собирать и освобождать все ресурсы сеанса, которые они выделяли.

+1

Имхо это не связано с весной. Если вы работаете в IIS и используете сеанс asp.net, вы можете создать global.asax и использовать 'protected void Session_End (Object sender, EventArgs e)' для очистки. – Andreas

+1

Согласно вашему обновлению 'SessionState.Abandon();' ваш друг. http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.abandon.aspx – Andreas

ответ

1

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

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

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

+0

Это работает в моей среде отладки, но при попытке его создания метод Dispose() не вызывается –