2017-12-11 14 views
2

.NET SDK (3.0.4 및 4.0.0 미리보기 모두)에 존재하지 않는 색인에 대한 색인이 있는지 확인하려고하면 ExistsAsync (ExistsExistsWithHttpMessagesAsync도 마찬가지 임) 다음 예외가 throw됩니다.Azure Search for .NET에 인덱스가 있는지 확인하는 경우 NullReferenceException이 발생합니다.

System.NullReferenceException: Object reference not set to an instance of an object. 
    at Microsoft.Azure.Search.IndexesOperations.<GetWithHttpMessagesAsync>d__12.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Azure.Search.ExistsHelper.<ExistsFromGetResponse>d__0`1.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Azure.Search.IndexesOperationsExtensions.<ExistsAsync>d__3.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at InphizCore.MiddleLayer.Services.AzureSearch.Services.AzureSearchWriter`1.<AssertIndexExists>d__8.MoveNext() in C:\xxx\AzureSearchWriter.cs:line 109 

우편함에서 http rest를 사용하면 색인이 없다는 메시지가 반환됩니다.

public async Task AssertIndexExists() 
     { 
      try 
      { 
       if (await searchServiceClient.Indexes.ExistsAsync(options.Value.IndexName) == false) 
       { 
        searchServiceClient.Indexes.Create(new Index(options.Value.IndexName, FieldBuilder.BuildForType<SearchableItemModel>(), corsOptions: new CorsOptions(new List<string> { "*" }))); 
       } 
      } 
      catch (Exception e) 
      { 
       logger.LogError($"Azure Search Index '{options.Value.IndexName}' could not be created. ({e.Message})"); 
       throw e; 
      } 
     } 

의미있는 방식으로 문제를 해결하려면 어떻게해야합니까?

UPDATE :

이것은 어떻게 단위 테스트에서 실행할 때 클라이언트가 같습니다

enter image description here

이 그것을 AspNetCore MVC에서 모습입니다 :

enter image description here

검색 클라이언트가 FirstMessageHandler,의 인스턴스를 만들지 못하는 것 같습니다및 HttpClientHandler. 왜 던지지 않니?

답변

3

글쎄, 이것은 이상하지만 어쩌면 SearchServiceClient의 내부 동작 일 수도 있습니다.

이 (편집 :하지 않습니다) 일 : 나는 Singleton 또는 작동 Transient에 생성자의 또 다른 및 설정 수명에 따라 패스 HttpClientHandler를 추가하는 경우

. 나는 이전에 Scoped.

services.AddTransient<SearchServiceClient>(x => 
{ 
    var httpClientHandler = new HttpClientHandler(); 

    var options = x.GetRequiredService<IOptions<AzureSearchOptions>>(); 
    var client = new SearchServiceClient(options.Value.SearchServiceName, new SearchCredentials(options.Value.AdminApiKey), httpClientHandler); 
    return client; 
}); 

UPDATE했다 :이 작품 : 위의 솔루션

행동은 예측할 수 있었고, 난이 호출 클래스에서이 방법으로 끝났다.

나는 전혀 오류를 제공하지 않는 것 내가 클라이언트를 필요 때마다 새로운 인스턴스를 생성 할 때 :

protected SearchServiceClient GetAzureSearchServiceClient() 
     { 
      return new SearchServiceClient(options.Value.SearchServiceName, new SearchCredentials(options.Value.AdminApiKey)); 
     } 
+1

는이에 대한 GitHub의에 문제를 여는시겠습니까를? repo는 여기에 있습니다 : https://github.com/azure/azure-sdk-for-net/issues 제목의 처음에 [Azure Search SDK]를 입력하십시오. 감사! –

+0

예! 생성 됨 https://github.com/Azure/azure-sdk-for-net/issues/3991 –

+0

안녕하세요, Jonas, NullReferenceException의 원인에 대한 가설이 있습니다. 자세한 내용은 GitHub 문제를 참조하십시오. –