2009-11-02 2 views
2

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

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

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

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

BuildSessionFactory возвращает следующее: (. * SVC)

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(); 
    } 
} 

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

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

NHibernateContext.Current().Session 

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

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

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

Для веб-приложения, используя эту службу, я создал «Interop» библиотеку, которая была основана на WSDL, автоматически генерируемый с помощью SvcUtil. Существует не веб-ссылка между веб-приложением и веб-службой, а только веб-приложение, использующее классы автогенера.

+0

retagged потому, что свободно-NHibernate является признанным тег – ddc0660

ответ

0

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

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

0

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

  1. Нанести AspNetCompatibilityRequirementsAttribute к вашим услугам с AspNetCompatibilityRequirementsMode необходимых.
  2. Что вы настройки среды хостинга в WCF web.config следующим образом:

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

More information about WCF Service hosting with ASP.NET is available here in the MSDN documentation.

+0

я не включал выше. Правильно ли я предполагаю, что, поскольку служба - это то, что хранит данные (а не веб-приложение), что в этом случае не требуется HttpModule? –

+0

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

0

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

[NHibernateContext(Rollback.Automatically)] 
public class YourWcfService : IYourWcfService 
Смежные вопросы