Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF和FluentNHibernate_C#_Wcf_Fluent Nhibernate - Fatal编程技术网

C# WCF和FluentNHibernate

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

我在这件事上遇到了麻烦。我有一个WCF库和相应的WCF web服务。沙盒web应用程序尝试从此服务触发一个方法

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

我按照注释和示例使用,并将以下行添加到我的global.asax(位于web服务目录中)

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();
    }
}
找不到任何实时会话。在单步执行应用程序之后,global.asax中的app start方法将被触发,但是在任何需要它的操作之前,它似乎正在消亡(这是一个猜测)

我意识到IglooCommons可能有点特殊,因为NHibernateContext是一个专有库,但是,带有持久层的WCF并不少见。非常感谢您对我错过的内容或其他方向的任何想法

附加说明:


对于使用此服务的web应用程序,我创建了一个基于wsdl的“互操作”库,该库使用svcutil自动生成。web应用和web服务之间没有web引用,只有使用auto gen类的web应用。

是否已为WCF服务启用ASP.NET服务宿主环境?这要求您:

  • 将应用于您的服务,并提供所需的
  • 请在WCF web.config中配置宿主环境,如下所示:

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

  • .

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

  • 将应用于您的服务,并提供所需的
  • 请在WCF web.config中配置宿主环境,如下所示:

    <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是一个已建立的标记