2010-07-16 2 views
1

Так что немного обзора вокруг этого исключения.Bizzare ASP.net «Ссылка на объект не установлена ​​в экземпляр объекта»

Я создал сайт на своей машине dev (windows xp, asp.net 4) и нацелил его на .Net 3.5. Затем я развернул 100% рабочий сайт на сценической машине (Windows 7, ASP.net 2, IIS 7.5).

После устранения многочисленных проблем с безопасностью я остановился на этом изумительном исключении, которое, хотя я четко понимаю, что это значит, я не могу понять, почему это исключение исходит из строки, упомянутой в стеке след.

... В каких местах вы много! :)

Так трассировки стека:

[NullReferenceException: Object reference not set to an instance of an object.] 
    DVL.Ruby.Admin.Config.ConfigManager..ctor(String path) in C:\Documents and Settings\Andy\Desktop\SS_DVL\Displays\Ruby.root\Ruby\Ruby.Admin\Config\ConfigManager.cs:41 
    DVL.Ruby.Admin.SettingGroups.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\Andy\Desktop\SS_DVL\Displays\Ruby.root\Ruby\Ruby.Admin\SettingStates.aspx.cs:33 
    System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 
    System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 
    System.Web.UI.Control.OnLoad(EventArgs e) +99 
    System.Web.UI.Control.LoadRecursive() +50 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627 

ConfigManager.cs

namespace DVL.Ruby.Admin.Config 
{ 
    public class ConfigManager 
    { 
     private XElement m_appSettings; 
     private XElement m_appMappings; 
     private XElement m_appConnectionStrings; 

     private List<Setting> m_settings; 
     private List<ConnectionString> m_connectionStrings; 

     private string m_path; 

     private ConfigManager() { } 

     private ConfigManager(string path) 
     { 
      if (path==null) 
      { 
       throw new NullReferenceException("The web.config path provided cannot be null."); 
      } 

      if (File.Exists(path)==false) 
      { 
       throw new ArgumentException("The web.config file does not exist."); 
      } 

      // Load the file 
      XDocument configDocument = XDocument.Load(path); 
      m_path = path; // <-- Line 41 

     // Do some stuff... 
     } 

     /// <summary> 
     /// Creates and returns a new instance of the ConfigManager 
     /// </summary> 
     /// <param name="path">The path of the web.config file to load.</param> 
     /// <returns>A new instance of the ConfigManager</returns> 
     public static ConfigManager Load(string path) 
     { 
      return new ConfigManager(path); 
     } 

SettingStates.aspx.cs

namespace DVL.Ruby.Admin 
{ 
    public partial class SettingGroups : System.Web.UI.Page 
    { 
     ConfigManager m_configManager; 
     List<State> m_states; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      // Check we have the location of the web.config file we'll be editing 
      string webConfigPath = WebConfigurationManager.AppSettings[Constants.ApplicationKey_WebConfigPath]; 
      if (webConfigPath == null) 
      { 
       return; 
      } 

      try 
      { 
       // Initialise the manager 
       m_configManager = ConfigManager.Load(webConfigPath); // <-- Line 33 
      } 
      catch (ConfigurationException ex) 
      { 
       ErrorMessage.Visible = true; 
       ErrorMessage.Text = ex.Message; 
       SaveStateButton.Enabled = false; 
       LoadStateButton.Enabled = false; 
       return; 
      } 

Так как вы можете видеть, нулевая ссылка происходящих на этой линии:

m_path = path; 

Что странно, потому что я проверяю, является ли путь нулевым (не то, чтобы это имело значение), а m_path уже имеет значение null, но это не имеет значения, поскольку я назначаю!

Одна вещь, которую я заметил, глядя на библиотеку в отражателе, что скомпилированные изменения версии к:

this.m_path = path; 

который я предполагаю, что дает логическую точку, в которой может быть неисправного (то есть «это» ссылка). Но почему это должно быть нулевым? Это как-то связано с моим статическим методом Load (string), создающим экземпляр объекта? Если да, то почему он работает на моем компьютере, а не на машине развертывания?

Я вполне счастлив иметь нормальный конструктор для объекта, но я просто следил за тем, как Microsoft разработала свои API (ala XDocument). Я попытался использовать рефлектор снова, чтобы увидеть, реализуют ли они свой метод загрузки по-разному, но метод пуст (возможно, запутался?).

Во всяком случае, позволяет завернуть, поэтому основные вопросы:

  • Почему неудачу на линии 41?
  • Почему это не происходит на моей машине dev?
+1

Вы не должны выбрасывать «NullReferenceException». Вместо этого выберите «ArgumentNullException». –

+0

Хороший вопрос! Не помогает моя проблема, хотя! :( – Andy

ответ

0

Хорошо,

Так в принципе, возможно, нуб ошибка. Веб-сайт был скомпилирован в Release, который, как я предполагаю, означает, что он не содержит всю информацию об отладке, поскольку это был номер строки, который был неправильным (строка 41 должна была указывать дальше в конструктор, где более понятная задача с конфигурацией).

Все хорошо и хорошо, но это меня немного задевает. Компилируются ли ASP.net в версии, отличной от консольных или других приложений? Я уверен, что у меня есть трассировка стека с правильными строками из Release раньше?

Кроме того, почему номера строк правильны дальше по трассе стека? т. е. линия 33 была правильной. Это просто чистое совпадение?

Ta!

Andy.

+0

В сборке выпусков нет всей информации об отладке, все комментарии удаляются и т. Д. Поэтому вы не можете получить номера линий для ошибки кода. Но если вы включаете файлы * .pdb, вы все равно можете получить отладочную информацию информация, поскольку она хранится в файле .pdb – Holger

Смежные вопросы