Is there an alternative for DelegatingHandler in Azure.Search.Documents.SearchClient?

44 views Asked by At

I've decided to migrate from Microsoft.Azure.Search 3.0.5 to Azure.Search.Documents, I've done everything according to a migration guide, but I couldn't find an alternative for DelegatingHandler in SeachClient ctor.

Previously I initialized SearchIndexClient with DelegatingHandler as a parameter to handle any errors, but the new Azure.Search.Documents.SearchClient doesn't accept DelegatingHandler[] as a parameter, what is an alternative way to do that?

Platform: .Net framework

What I Tried: I tried to use different versions of Azure.Documents.Search and asked Azure team - https://github.com/MicrosoftDocs/azure-docs/issues/117377

1

There are 1 answers

1
Suresh Chikkam On BEST ANSWER

Creating a custom HttpClient with a custom HttpClientHandler and using it for HTTP operations outside the SearchClient.

  • Here is a simple console application creating a SearchClient without a custom DelegatingHandler
using System;
using System.Net.Http;
using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Indexes.Models;

class Program
{
    static void Main()
    {
        // Your search service endpoint and API key
        string searchServiceEndpoint = "https://your-search-service-name.search.windows.net";
        string apiKey = "your-search-service-api-key";

        // Create a custom HttpClient with a custom handler
        HttpClient customHttpClient = CreateCustomHttpClient();

        // Create a SearchClient using the custom HttpClient
        SearchClient searchClient = new SearchClient(new Uri(searchServiceEndpoint), "your-index-name", new SearchApiKeyCredential(apiKey), new SearchClientOptions
        {
            Transport = new HttpClientTransport(customHttpClient)
        });

        // Now you can use the searchClient for various search operations

        // Example: Query documents
        SearchResults<MyDocumentModel> results = searchClient.Search<MyDocumentModel>("your search query");

        // Process search results
        foreach (SearchResult<MyDocumentModel> result in results.GetResults())
        {
            Console.WriteLine($"Document ID: {result.Document.Id}");
            // Process other document fields as needed
        }

        Console.WriteLine("Search completed successfully.");
    }

    // Create a custom HttpClient with a custom handler
    static HttpClient CreateCustomHttpClient()
    {
        var handler = new YourCustomHttpClientHandler(); // Replace with your custom handler
        return new HttpClient(handler);
    }
}

// Implement your custom HttpClientHandler
class YourCustomHttpClientHandler : HttpClientHandler
{
    protected override HttpResponseMessage Send(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        // Implement your custom logic here
        // You can inspect the request, handle errors, etc.

        // Call the base Send method to continue with the request
        return base.Send(request, cancellationToken);
    }
}

// Define your document model
public class MyDocumentModel
{
    public string Id { get; set; }
    // Add other properties based on your document structure
}
  • I have migrated some dummy document for testing, check below.

enter image description here

  • When the search query does not match any existing document IDs.

enter image description here