C# 在Azure函数中通过CSOM从SharePoint Online访问TermCollection时为空术语

C# 在Azure函数中通过CSOM从SharePoint Online访问TermCollection时为空术语,c#,azure,sharepoint,sharepoint-online,azure-functions,C#,Azure,Sharepoint,Sharepoint Online,Azure Functions,我正在尝试使用Azure函数公开RESTAPI,该函数使用CSOM和C从SharePoint Online中的特定术语集返回术语 我完全可以从控制台应用程序中调用完全相同的CSOM代码,它能够循环使用术语并成功地输出到控制台 但是,当从Azure函数主机调用下面的代码时,在TermCollection或IEnumerable中循环时,它总是会找到空术语对象的集合。我已经尝试过在TermSet.GetAllTerms上使用ClientContext.LoadQuery,以及仅通过TermSet.T

我正在尝试使用Azure函数公开RESTAPI,该函数使用CSOM和C从SharePoint Online中的特定术语集返回术语

我完全可以从控制台应用程序中调用完全相同的CSOM代码,它能够循环使用术语并成功地输出到控制台

但是,当从Azure函数主机调用下面的代码时,在TermCollection或IEnumerable中循环时,它总是会找到空术语对象的集合。我已经尝试过在TermSet.GetAllTerms上使用ClientContext.LoadQuery,以及仅通过TermSet.Terms属性加载TermCollection

只要迭代器在foreach中命中一个术语(我也尝试将其作为LINQ Select),它就会认为该项为NULL,因此对其调用属性就会抛出NullReferenceException。我无法将控制台应用程序调用的行为复制到同一代码中-它只是按照预期工作,并检索每个术语对象

为什么这会发生在Azure功能主机中,而不是控制台应用程序中?我怎样才能解决这个问题

更新:有人将此问题标记为NRE的副本。我知道什么以及如何发生NRE。这里的问题是,当从不同的主机调用相同的代码时,为什么会发生这种情况??我知道NRE被抛出的确切位置,以及抛出它的对象是什么——但它不应该是,因为这段代码的工作原理与控制台应用程序相同。从Azure函数主机调用时有什么区别

下面是run.csx函数,调用上面的代码,该代码已编译成DLL并放置在Azure函数的Bin文件夹中:

#r "CsomTaxonomyHelper.dll"
#r "Newtonsoft.Json"

using System.Net;
using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.Taxonomy;
using CsomTaxonomyHelper;
using Newtonsoft.Json;

static TraceWriter _log = null;
public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log)
{
    _log = log;
    _log.Info("C# HTTP trigger function processed a request. Getting mmd terms from SPO...");


    var terms = GetFocusAreas();
    var result = JsonConvert.SerializeObject(terms);

    return req.CreateResponse(HttpStatusCode.OK, result);
}

static IEnumerable<TermViewModel> GetFocusAreas()
{
    string spSiteUrl = System.Environment.GetEnvironmentVariable("SPOSiteUrl", EnvironmentVariableTarget.Process);
    string userName = System.Environment.GetEnvironmentVariable("SPOUserName", EnvironmentVariableTarget.Process);
    string password = System.Environment.GetEnvironmentVariable("SPOPassword", EnvironmentVariableTarget.Process);

    var securePwd = new PasswordString(password).SecurePassword;

    using (var ctx = new ClientContext(spSiteUrl))
    {
        ctx.Credentials = new SharePointOnlineCredentials(userName, securePwd);
        ctx.ExecuteQuery();

        _log.Info("Logged into SPO service.");

        var search = new TermSearch(ctx);
        try
        {
            var result = search.GetTerms(new Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
            return result;
        }
        catch (Exception ex)
        {
            _log.Error(ex.Message, ex);
            throw;
        }
    }
}
以下是本地调试器的屏幕截图,当使用Azure Functions CLI对此进行调试时,您可以看到它确实在集合中找到了10个项,但所有项都为空:


@Peter Duniho-这不是NRE的复制品。请完整地重新阅读此问题。您是否尝试过远程调试?@AndrésNava-.NET是的,我正在使用Azure函数CLI,并在本地看到相同的行为。从AF调用类库中的同一代码与从控制台应用程序调用类库中的同一代码的行为非常奇怪。除非你能以比为什么我会得到一个NullReferenceException更具体的方式提出你的问题,否则它在很大程度上是标记问题的重复。如果你需要帮助,你需要超越它。发布一篇可靠地再现问题的好文章,详细解释调试问题所做的工作、发现的问题以及仍然需要帮助的问题。仅仅知道存在一个您不期望的空引用是不够的
#r "CsomTaxonomyHelper.dll"
#r "Newtonsoft.Json"

using System.Net;
using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.Taxonomy;
using CsomTaxonomyHelper;
using Newtonsoft.Json;

static TraceWriter _log = null;
public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log)
{
    _log = log;
    _log.Info("C# HTTP trigger function processed a request. Getting mmd terms from SPO...");


    var terms = GetFocusAreas();
    var result = JsonConvert.SerializeObject(terms);

    return req.CreateResponse(HttpStatusCode.OK, result);
}

static IEnumerable<TermViewModel> GetFocusAreas()
{
    string spSiteUrl = System.Environment.GetEnvironmentVariable("SPOSiteUrl", EnvironmentVariableTarget.Process);
    string userName = System.Environment.GetEnvironmentVariable("SPOUserName", EnvironmentVariableTarget.Process);
    string password = System.Environment.GetEnvironmentVariable("SPOPassword", EnvironmentVariableTarget.Process);

    var securePwd = new PasswordString(password).SecurePassword;

    using (var ctx = new ClientContext(spSiteUrl))
    {
        ctx.Credentials = new SharePointOnlineCredentials(userName, securePwd);
        ctx.ExecuteQuery();

        _log.Info("Logged into SPO service.");

        var search = new TermSearch(ctx);
        try
        {
            var result = search.GetTerms(new Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
            return result;
        }
        catch (Exception ex)
        {
            _log.Error(ex.Message, ex);
            throw;
        }
    }
}