2010-11-10 2 views
3

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

Есть ли способ создавать сеансы, когда они необходимы?

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

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

ответ

3

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

From Here (http://www.asp.net/hosting/tutorials/core-differences-between-iis-and-the-asp-net-development-server-cs)

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

+0

трюк - это только «OpenSession», когда контроллер имеет зависимость от ISession. Похоже, вы слепо открываете сессию внутри глобального BeginRequest. Я не поклонник этого. – dotjoe

+0

Это также происходит на новом IIS Express. –

3

Это звучит, как вам нужно, чтобы исключить эти пути в вашей маршрутизации:

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

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

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

1

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

вещи высматривать

  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 и только если его контроллер или его зависимые зависят от него

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

+0

Контейнер = новый WindsorContainer(); – Fran

+0

интригующий, им не уверен, что MvcApplication.CurrentSession, я думаю, его статический (я не поклонник статического в веб-приложениях). Возвращаясь к коду, попробуйте перейти на PerWebRequest через Transient для ISession. – dbones

0

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

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