2009-11-02 88 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