WCF и FluentNHibernate

2

Я ударил стену по этому. У меня есть библиотека WCF с соответствующим веб-сервисом WCF. Веб-приложение из песочницы пытается запустить один из методов из этой службы.

Служба, однако, будет регистрировать запросы по мере их создания. Уровень сохранения здесь построен с использованием FluentNHibernate. Управление сеансом в веб-приложении в прошлом было довольно простым (т.е. HttpModules), но в WCF для меня было немного сложно.

Я следил за примечаниями и примерами с помощью библиотеки IglooCommons и добавил следующую строку в мой global.asax(находясь в каталоге веб-службы).

    protected void Application_Start(object sender, EventArgs e)
    {
        NHibernateFactory.Initialize(new SessionFactory().BuildSessionFactory());
    }

BuildSessionFactory возвращает следующее:

public class SessionFactory
{
    public SessionFactory() { }

    public ISessionFactory BuildSessionFactory()
    {
        return Fluently.Configure()
            .Database(MsSqlConfiguration
                        .MsSql2005
                        .ConnectionString(x =>
                            x.FromConnectionStringWithKey("myConnection"))
                        .ShowSql()
                        .CurrentSessionContext<WebSessionContext>())
            .Mappings(m =>
                m.FluentMappings
                    .AddFromAssemblyOf<OneClass>()
                    .AddFromAssemblyOf<AnotherClass>()
                    .Conventions.Add(
                        PrimaryKey.Name.Is(x => x.EntityType.Name + "ID"),
                        ForeignKey.EndsWith("ID"),
                        Table.Is(x => Inflector.Net.Inflector.Pluralize(x.EntityType.Name))))
            .BuildSessionFactory();
    }
}

Страница сервиса (*. svc) загружается с помощью успокаивающего синего цвета "для создания классов, использующих эту страницу wsdl", без проблем.

Когда веб-приложение, ссылающееся на это, пытается вызвать метод службы,

NHibernateContext.Current().Session

не может найти какую-либо живую сессию. После того, как вы перейдете через приложение, запускается метод запуска приложения в global.asax, но, похоже, он умирает (это предположение) до любых действий, требующих его.

Я понимаю, что IglooCommons может быть немного специфичным, поскольку NHibernateContext является запатентованной библиотекой, однако WCF с уровнем сохранения не является чем-то необычным. Любые мысли о том, что я пропустил, или какое-то другое направление, очень ценятся.

Дополнительное примечание:

Для веб-приложения, использующего эту службу, я создал библиотеку "interop", которая была основана на wsdl, автоматически сгенерированном с использованием svcutil. Существует не веб-ссылка между веб-приложением и веб-службой, а только веб-приложение, использующее классы автогенера.

  • 0
    Смотрите эту статью realfiction.net/?q=node/167 Делайте то, что он говорит, и вам не понадобится совместимость с aspnet.
  • 0
    повторно помечены, потому что fluent-nhibernate является установленным тегом
Теги:
wcf
fluent-nhibernate

4 ответа

0
Лучший ответ

Эта резолюция, в частности, была непониманием IglooCommons lib. Атрибут "NHibernateContext" в примере использовался для украшения интерфейса, когда на самом деле ему нужно было украсить реализацию. Перемещая это, образец на сайте Igloo мог нормально функционировать.

В качестве дополнительной заметки другие предлагаемые здесь решения были превосходны в расширении небольшого знания, которое у меня есть для внутренней работы с WCF и его взаимодействия с NHibernate.

1

См. статью http://realfiction.net/?q=node/167

Сделайте то, что он говорит, и вам не понадобится активировать aspnet совместимость.

0

Ваш файл svc.cs службы WCF должен выглядеть следующим образом:

[NHibernateContext(Rollback.Automatically)]
public class YourWcfService : IYourWcfService 
0

Включили ли вы среду хостинга ASP.NET для службы WCF? Это требует, чтобы вы:

  • Примените AspNetCompatibilityRequirementsAttribute к вашему сервису с помощью AspNetCompatibilityRequirementsMode требуемого.
  • Чтобы настроить среду хостинга в WCF web.config следующим образом:

    <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
        <!-- rest of config here -->
    </system.serviceModel>
    

Дополнительная информация о WCF Service хостинге с ASP.NET доступна здесь в документации MSDN.

  • 0
    Я не включил выше. Правильно ли я предположил, что поскольку служба представляет собой постоянные данные (а не веб-приложение), то в этом сценарии не требуется HttpModule?
  • 0
    Честно говоря, я не знаю, как архитектура NHibernate подключается / работает с ASP.NET, поэтому, если он требует HttpModule обычно в «чистом» мире ASP.NET, у вас должна быть та же самая конфигурация, чтобы использовать его в WCF таким образом. Альтернативой может быть то, что они обеспечивают какое-то «чистое» поведение WCF, а затем вы используете их и отбрасываете среду хостинга ASP.NET, так как обходиться вокруг этой среды дороже и выполнять свою собственную обработку запросов / ответов поверх WCF.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню