2009-11-02 55 views
2

我在这一个上打了一堵墙。我有一个WCF库与各自的WCF Web服务。沙盒Web应用程序尝试从此服务中启动一个方法。WCF和FluentNHibernate

但是,该服务会在请求发出时记录请求。这里的持久层是用FluentNHibernate构建的。 Web应用程序中的会话管理在过去一直很直接(即HttpModules),但在WCF中对我来说有点棘手。

我遵循笔记和IglooCommons library的示例,并将以下行添加到我的global.asax(驻留在Web服务目录中)。

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” 页面,没有问题。

当引用此Web应用程序试图调用服务的方法,

NHibernateContext.Current().Session 

无法找到任何实时会话。在逐步完成应用程序之后,global.asax中的app start方法正在被解雇,但在任何需要它的操作之前似乎正在死亡(这是一种猜测)。

我意识到IglooCommons可能有点特定,因为NHibernateContext是一个专有库,但是,带有持久层的WCF并不少见。任何想到我错过了什么或另一个方向采取非常感谢。

附加说明:

使用这项服务的Web应用程序,我创建了这是基于WSDL,自动生成使用SvcUtil工具的“互操作”库。 Web应用程序和Web服务之间没有Web引用,只是使用自动生成类的Web应用程序。

+0

重新标记,因为流利,NHibernate的是一个既定的标签 – ddc0660 2009-11-05 18:43:49

回答

0

该决议特别是对IglooCommons lib的误解。示例中的“NHibernateContext”属性用于修饰接口,实际上它需要修饰实现。通过单独搬迁,Igloo网站上的样本能够正常运行。

作为一个方面说明,这里提供的其他解决方案在扩展我对WCF的内部工作以及它与NHibernate的交互方面的知识方面非常出色。

0

您是否为您的WCF服务启用了ASP.NET服务托管环境?这就要求你:

  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

我没有启用以上。假设由于服务是持久化数据(而不是Web应用程序),我是否正确?是否在此方案中不需要HttpModule? – 2009-11-02 23:06:06

+0

老实说,我不知道NHibernate体系结构如何插入/播放ASP.NET,所以如果它通常需要在“纯粹”的ASP.NET世界中使用HttpModule,那么应该有相同的配置以这种方式在WCF中使用它。另一种选择是他们提供某种“纯粹的”WCF行为,然后使用这些行为并丢弃ASP.NET托管环境,因为将环境放在您身边并在顶部执行自己的请求/响应处理成本更高WCF的。 – 2009-11-02 23:11:50

0

WCF服务svc.cs文件应该是这样的:

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