C# WCF和FluentNHibernate
我在这件事上遇到了麻烦。我有一个WCF库和相应的WCF web服务。沙盒web应用程序尝试从此服务触发一个方法 但是,该服务将在请求发出时记录请求。这里的持久层是用FluentNHibernate构建的。web应用程序中的会话管理在过去非常简单(即HttpModules),但在WCF中它对我来说有点棘手 我按照注释和示例使用,并将以下行添加到我的global.asax(位于web服务目录中) BuildSessionFactory返回以下内容:C# WCF和FluentNHibernate,c#,wcf,fluent-nhibernate,C#,Wcf,Fluent Nhibernate,我在这件事上遇到了麻烦。我有一个WCF库和相应的WCF web服务。沙盒web应用程序尝试从此服务触发一个方法 但是,该服务将在请求发出时记录请求。这里的持久层是用FluentNHibernate构建的。web应用程序中的会话管理在过去非常简单(即HttpModules),但在WCF中它对我来说有点棘手 我按照注释和示例使用,并将以下行添加到我的global.asax(位于web服务目录中) BuildSessionFactory返回以下内容: public class SessionFacto
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();
}
}
找不到任何实时会话。在单步执行应用程序之后,global.asax中的app start方法将被触发,但是在任何需要它的操作之前,它似乎正在消亡(这是一个猜测)
我意识到IglooCommons可能有点特殊,因为NHibernateContext是一个专有库,但是,带有持久层的WCF并不少见。非常感谢您对我错过的内容或其他方向的任何想法
附加说明:
对于使用此服务的web应用程序,我创建了一个基于wsdl的“互操作”库,该库使用svcutil自动生成。web应用和web服务之间没有web引用,只有使用auto gen类的web应用。是否已为WCF服务启用ASP.NET服务宿主环境?这要求您:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<!-- rest of config here -->
</system.serviceModel>
.您是否为WCF服务启用了ASP.NET服务托管环境?这要求您:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<!-- rest of config here -->
</system.serviceModel>
这项决议尤其是对冰屋公共图书馆的误解。示例中的“NHibernateContext”属性用于修饰接口,而实际上它需要修饰实现。通过单独移动,冰屋现场的样本能够正常工作
作为旁注,这里提供的其他解决方案在扩展我对WCF内部工作及其与NHibernate的相互作用所知甚少方面非常出色。这个解决方案尤其是对Igloo Commons lib的误解。示例中的“NHibernateContext”属性用于修饰接口,而实际上它需要修饰实现。通过单独移动,冰屋现场的样本能够正常工作
作为旁注,这里提供的其他解决方案在扩展我对WCF内部工作及其与NHibernate交互的一点了解方面非常出色。您的WCF服务svc.cs文件应该如下所示:
[NHibernateContext(Rollback.Automatically)]
public class YourWcfService : IYourWcfService
您的WCF服务svc.cs文件应如下所示:
[NHibernateContext(Rollback.Automatically)]
public class YourWcfService : IYourWcfService
我没有启用上述功能。我的假设正确吗?因为服务是持久化数据的东西(而不是web应用程序),所以在这种情况下不需要HttpModule?老实说,我不知道NHibernate体系结构是如何与ASP.NET集成的,所以如果它在“纯”ASP.NET世界中通常需要HttpModule,您应该具有相同的配置,以便以这种方式在WCF中使用它。另一种选择是,它们提供某种“纯”WCF行为,然后您使用这些行为并放弃ASP.NET托管环境,因为让该环境围绕您旋转,并在WCF的基础上进行自己的请求/响应处理更为昂贵。我没有启用上述功能。我的假设正确吗?因为服务是持久化数据的东西(而不是web应用程序),所以在这种情况下不需要HttpModule?老实说,我不知道NHibernate体系结构是如何与ASP.NET集成的,所以如果它在“纯”ASP.NET世界中通常需要HttpModule,您应该具有相同的配置,以便以这种方式在WCF中使用它。另一种选择是,它们提供某种“纯”WCF行为,然后您使用这些行为并放弃ASP.NET托管环境,因为在您周围旋转该环境并在WCF的基础上进行自己的请求/响应处理的成本更高。请参阅本文,按照它所说的去做,您将不需要启用aspnetcompatibility.retag,因为fluent nhibernate是一个已建立的tag请参阅本文中的内容,您不需要启用aspnetcompatibility.retaged,因为fluent nhibernate是一个已建立的标记