Я ударил стену по этому. У меня есть библиотека 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. Существует не веб-ссылка между веб-приложением и веб-службой, а только веб-приложение, использующее классы автогенера.
Эта резолюция, в частности, была непониманием IglooCommons lib. Атрибут "NHibernateContext" в примере использовался для украшения интерфейса, когда на самом деле ему нужно было украсить реализацию. Перемещая это, образец на сайте Igloo мог нормально функционировать.
В качестве дополнительной заметки другие предлагаемые здесь решения были превосходны в расширении небольшого знания, которое у меня есть для внутренней работы с WCF и его взаимодействия с NHibernate.
См. статью http://realfiction.net/?q=node/167
Сделайте то, что он говорит, и вам не понадобится активировать aspnet совместимость.
Ваш файл svc.cs службы WCF должен выглядеть следующим образом:
[NHibernateContext(Rollback.Automatically)]
public class YourWcfService : IYourWcfService
Включили ли вы среду хостинга ASP.NET для службы WCF? Это требует, чтобы вы:
Чтобы настроить среду хостинга в WCF web.config следующим образом:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<!-- rest of config here -->
</system.serviceModel>
Дополнительная информация о WCF Service хостинге с ASP.NET доступна здесь в документации MSDN.