Сессия nhibernate, созданная для каждого веб-запроса в asp.net MVC2 - PullRequest
3 голосов
/ 10 ноября 2010

У меня есть приложение ASP.net MVC2, которое использует NHibernate для доступа к данным. При каждом запросе, даже при статических запросах файлов (изображения, javascript), создается новый сеанс. Поэтому для одного представления, в котором я возвращаю список, я создаю около 15 сеансов, которые ничего не загружают.

есть ли способ создавать сеансы только тогда, когда они требуются?

В настоящее время я использую Castle.Windsor для внедрения сеанса в мои контроллеры.

Есть ли способ отфильтровать запросы статических файлов?

Ответы [ 4 ]

3 голосов
/ 11 ноября 2010

Также я понял, что это не конфигурация с NHibernate или MVC. Дело в том, что сервер разработки ASP.net обслуживает каждый запрос через ASP.net. IIS не будет отправлять запросы статических файлов через ASP.net, пока не настроено.

Отсюда (http://www.asp.net/hosting/tutorials/core-differences-between-iis-and-the-asp-net-development-server-cs)

Еще одно основное отличие IIS и сервер разработки ASP.NET как они обрабатывают запросы на статические содержание. Каждый запрос, который приходит в сервер разработки ASP.NET, для страницы ASP.NET, изображение, или файл JavaScript, обрабатывается среда выполнения ASP.NET. По умолчанию IIS только вызывает среду выполнения ASP.NET, когда приходит запрос на ASP.NET ресурс, такой как веб-страница ASP.NET, веб-сервис и так далее. Запросы для статического контента - изображения, CSS файлы, файлы JavaScript, файлы PDF, ZIP-файлы и тому подобное - есть извлечено IIS без участие среды выполнения ASP.NET.

3 голосов
/ 10 ноября 2010

Звучит так, как будто вам необходимо исключить эти пути в маршрутизации:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // add these lines
    routes.IgnoreRoute("{resource}.jpg");
    routes.IgnoreRoute("{resource}.js");
}

Хотя, если вы спросите меня, запрос статического файла не должен создавать экземпляр контроллера.Возможно, вы захотите взглянуть на свой код и выяснить, почему он это делает.

1 голос
/ 11 ноября 2010

как вы создаете сеанс, так как .jpg не должен запрашивать экземпляр ISession, поэтому замок не создаст его (насколько я понимаю), не могли бы вы опубликовать настройку замка и как вы реализовали его какfactory?

на что обратить внимание

  1. Убедитесь, что ваша фабрика сессий является одноэлементной
  2. Создайте сеанс как PerWebRequest, используя OpenSession изSessionFactory

    //Setup the Hibernate dependencies
        container.AddFacility<FactorySupportFacility>().Register(
            Component.For<ISessionFactory>().LifeStyle.Singleton
                .Instance(NHibernateHelper.GetSessionFactory()),
            Component.For<ISession>().LifeStyle.PerWebRequest
                .UsingFactoryMethod(kernel => kernel.Resolve<ISessionFactory>().OpenSession())
            );
    

    после того, как вы зарегистрировали замок в MVC в качестве фабрики контроллеров, он должен создавать только один сеанс PerWebRequest и только если от него зависит контроллер или его зависимые элементы

У меня есть образец приложения , если это поможет

0 голосов
/ 11 ноября 2010

Я использую Spring.NET, а не Castle Windsor, но я предполагаю, что концепции одинаковы. Объем вашей сессии ISession должен быть определен в соответствии с запросом, и его не следует создавать до тех пор, пока его не попросят, как говорит dbones. В то время как MVC обрабатывает каждый запрос, запрос .jpg не должен попадать в контроллер, который зависит от ISession.

Castle Windsor с готовностью создает объекты по запросу, а не по запросу? Это может быть проблемой конфигурации. Или у вас есть пользовательский модуль, обработчик или метод приложения Global.asax, который запрашивает у Windsor ISession?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...