gpt4 book ai didi

c# - 这怎么会抛出 NullReferenceException?

转载 作者:太空宇宙 更新时间:2023-11-03 11:39:46 27 4
gpt4 key购买 nike

我有以下代码:

EventLog el1 = new EventLog();
el1.Log = "Application";
el1.Source = "SharePoint Foundation";

el1.WriteEntry("Start", EventLogEntryType.Information);
el1.WriteEntry("SPContext : " + (SPContext.Current == null ? "nothing" : "something"), EventLogEntryType.Information);
el1.WriteEntry("Web ID: " + (SPContext.Current.Web == null ? "nothing" : "something"), EventLogEntryType.Information);

前两个 WriteEntry 记录正常,第二个记录“某事”。但是第三个总是会出错。我的大脑只是被炸毁了,还是这永远不会发生?

请注意:第二个 WriteEntry 将“某事”写入日志。这意味着 SPContext.Current 不为空。

更新:

我不知道这是否有影响,但我使用 SPSecurity.RunWithElevatedPrivileges 以提升的权限运行它。这是我的代码:

        SPSecurity.RunWithElevatedPrivileges(delegate()
{
try
{
EventLog el1 = new EventLog();
el1.Log = "Application";
el1.Source = "SharePoint Foundation";
el1.WriteEntry("Start", EventLogEntryType.Information);
el1.WriteEntry("SPContext : " + (SPContext.Current == null ? "nothing" : "something"), EventLogEntryType.Information);
el1.WriteEntry("Web ID: " + (SPContext.Current.Web == null ? "nothing" : "something"), EventLogEntryType.Information);

}
catch (Exception ex)
{
EventLog el1 = new EventLog();
el1.Log = "Application";
el1.Source = "SharePoint Foundation";
el1.WriteEntry(ex.Message + System.Environment.NewLine + ex.StackTrace, EventLogEntryType.Error);
throw ex;
}
});

还有我的堆栈跟踪:

Object reference not set to an instance of an object.
at Copy_Special.CrossSiteCopy.<>c__DisplayClass1.<Execute>b__0()

仅供引用,此代码是 SharePoint 自定义工作流操作的一部分...

最佳答案

更新:根据问题中提供的新说明和此答案下方的评论完全重写了我的答案。

  1. 最后一行至少应该如下所示:

    SPContext.Current == null || SPContext.Current.Web == null ? "nothing" : "something"
  2. SPContext.Web 属性包含一个相当复杂的逻辑,在某些情况下会创建一个新的 SPWeb 实例。因此,它很可能会因 NullReferenceException 而失败,尽管没有记录该行为。在许多情况下,它还会产生 InvalidOperationException

  3. 在提升的权限下,没有有效的 SPContext.Current。您必须再次打开该网站以检索可在不同安全环境下工作的 SPWeb 实例。

正确提升权限的示例代码:

// site and web objects working with the current user's privileges
SPSite userSite = SPContext.Current.Site;
SPWeb userWeb = SPContext.Current.Web;

// elevate privileges
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// get new site and web objects working with elevated privileges
using (SPSite elevatedSite = new SPSite(userSite.ID))
{
using (SPWeb elevatedWeb = ElevatedsiteColl.OpenWeb(userWeb.ID))
{
// …code using elevatedSite and elevatedWeb…
}
}
});

关于c# - 这怎么会抛出 NullReferenceException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5081251/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com