Nhibernate不在生产环境中工作

时间:2013-11-05 17:55:36

标签: c# nhibernate iis

我正在使用带有NHibernate的C#.NET 3.5 Web App。一切都在开发环境中运行良好,但是当我在IIS中部署应用程序时,我得到以下异常:

 Object reference not set to an instance of an object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 

An unhandled exception was generated during the execution of the current web request.     Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 

[NullReferenceException: Object reference not set to an instance of an object.]
SVC_Cadu_Dal.Helper.NHibernateHelper.get_SessionFactory() in C:\workspace\SVC_Applications\cadu\SVC_Cadu\SVC_Cadu_Dal\Helper\NHibernateHelper.cs:73
SVC_Cadu_Dal.Helper.NHibernateHelper.OpenSession() in C:\workspace\SVC_Applications\cadu\SVC_Cadu\SVC_Cadu_Dal\Helper\NHibernateHelper.cs:82
SVC_Cadu.PessoaPage.initDropDownList(DropDownList ddl, Type type) in C:\workspace\SVC_Applications\cadu\SVC_Cadu\SVC_Cadu\PessoaPage.aspx.cs:84
SVC_Cadu.PessoaPage.initComponents() in C:\workspace\SVC_Applications\cadu\SVC_Cadu\SVC_Cadu\PessoaPage.aspx.cs:66
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +52
System.Web.UI.Control.OnLoad(EventArgs e) +137
System.Web.UI.Control.LoadRecursive() +98
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2524

这是我的NHibernateHelper类:

public class NHibernateHelper {
    private static ISessionFactory sessionFactory;
    private static ISession session;

    private static ISessionFactory SessionFactory {
        get {
            if(sessionFactory == null) {
                try {
                    var config = new Configuration();
                    // ----------------------------------------------------
                    // Configuration for DEVELOPMENT and PRODUCTION envs.
                    config.Configure(Path.Combine(
                            AppDomain.CurrentDomain.BaseDirectory,
                            "bin\\hibernate.cfg.xml"));
                    // ----------------------------------------------------
                    HbmSerializer.Default.Validate = true;
                    //log4net.Config.XmlConfigurator.Configure();
                    sessionFactory = config.BuildSessionFactory();
                } catch(Exception e) {
                    throw(e.InnerException);
                }
            }
            return sessionFactory;
        }
    }

    public static ISession OpenSession() {
        return session != null && session.IsOpen ? session
                : session = SessionFactory.OpenSession();
    }
}

我的解决方案看起来像这样:

- Solution
    - WebApp <project>
    - Dal <project>
        - "Mappings" <folder>
        - hibernate.cfg.xml (Embedded Resource, Copy Always) <file>
        - Helpers <folder>
            - NHibernateHelper.cs
    - Model <project>
        - "Models" <classes>
    - (...)

其他重要信息是,我正在使用XML映射(不是流畅的或类映射)。 我已经尝试过了:

  • 将“hibernate.cfg.xml”内容放在“Web.config”文件中(当然,更改“config.Configure()”方法中的参数;
  • 未将任何值传递给“config.Configure()”方法;
  • 将硬编码字符串放入“config.Configure()”,例如“config.Configure(”bin \ hibernate.cfg.xml“);
  • 惊魂

我无法理解为什么我的NHibernate配置在开发中有效但在生产中无效。我做错了什么?

1 个答案:

答案 0 :(得分:1)

为什么不使用HttpContext.Current.Server.MapPath来获取服务器中的文件路径。

同时检查文件夹执行和读取的权限,也许在应用程序池中配置的用户没有读取bin文件夹的权限。你是否已经尝试将nhibernate.cfg.xml放在其他文件夹中,也可能放在App_data等其他文件夹中?