Так что немного обзора вокруг этого исключения.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?
Вы не должны выбрасывать «NullReferenceException». Вместо этого выберите «ArgumentNullException». –
Хороший вопрос! Не помогает моя проблема, хотя! :( – Andy