【问题标题】:Azure Search SearchParameters Object reference not set to an instance of an object errorAzure 搜索 SearchParameters 对象引用未设置为对象错误的实例
【发布时间】:2019-02-08 01:23:15
【问题描述】:

我正在尝试将搜索字段添加到我的 Azure 搜索查询(请参阅下面的 SearchParameters 对象实例化)。

    public async Task StartAsync(IDialogContext context)
    {
        ISearchIndexClient indexClient = CreateSearchIndexClient();
        try
        {
            Trace.TraceInformation($"Starting StartAsync");
            SearchParameters searchParameters = new SearchParameters();
            searchParameters.SearchFields.Add("StoreNumber");
            searchParameters.SearchFields.Add("StoreName");
            Trace.TraceInformation($"Finished adding search fields");
           // Trace.TraceInformation($"Search Parameters added = {searchParameters.SearchFields.Count}");

            DocumentSearchResult results = await indexClient.Documents.SearchAsync(searchText, searchParameters);
            Trace.TraceInformation($"results obtained");

            List<SearchHit> searchHits = results.Results.Select(r => ResultMapper.ToSearchHit(r)).ToList();
            Trace.TraceInformation($"search hits {searchHits.Count}");
            await SendResultsOfSearch(context, results);
        }
        catch (Exception ex)
        {
            Trace.TraceError($"Exception {ex.ToString()}");
        }
    }

由于某种原因,它抛出了以下异常,但我不知道为什么?

2018-09-03T00:47:39  PID[3268] Information Starting StartAsync
2018-09-03T00:47:39  PID[3268] Error       Exception System.NullReferenceException: Object reference not set to an instance of an object.
   at LuisBot.Dialogs.SearchRBMDialog.<StartAsync>d__2.MoveNext() in C:\Users\jmatson\Downloads\retail-info-bot-v2-src\Dialogs\SearchRBMDialog.cs:line 32

代码编译好了吗?据我所知,不需要构造函数参数。

【问题讨论】:

  • 您能否澄清 StartAsync 中的哪一行是第 32 行(因为那是出现在异常堆栈跟踪中的内容)?

标签: c# botframework azure-cognitive-search


【解决方案1】:

SearchFields 没有被SearchParameters 构造函数初始化(参见源代码here),因此在其上调用Add 将导致NullReferenceException。它的类型为IList,因此初始化它的最简单方法是为其分配一个数组,如下所示:

searchParameters.SearchFields = new[] { "StoreNumber", "StoreName" };

【讨论】:

    【解决方案2】:

    几种可能性(取决于您的对象实现):

    这里:

    SearchParameters searchParameters = new SearchParameters();
    searchParameters.SearchFields.Add("StoreNumber");
    searchParameters.SearchFields.Add("StoreName");
    

    SearchFieldsList 吗?它是在SearchParameters 构造期间初始化的吗?如果没有,在这种情况下,当您将项目添加到未实例化的内容时,您可以拥有 NullReferenceException

    或者这里:

    List<SearchHit> searchHits = results.Results.Select(r => ResultMapper.ToSearchHit(r)).ToList();
    

    在您的 results 对象中,您确定 Results 已实例化吗?如果没有,NullReferenceException

    要查找引发异常的行,请查看代码中的第 32 行(行号在错误日志中)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-09
      • 2012-08-31
      • 2011-11-21
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多