You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure.Search.Documents.SearchClient中DelegatingHandler替代方案咨询

在.NET Framework中迁移Azure Search SDK时替换DelegatingHandler的方案

原Microsoft.Azure.Search中的SearchIndexClient通过传入DelegatingHandler[]处理请求/响应逻辑,在新版Azure.Search.Documents的SearchClient中,这一能力由**HttpPipelinePolicy**和自定义HttpPipeline替代,具体实现步骤如下:

1. 将自定义DelegatingHandler适配为HttpPipelinePolicy

新版Azure SDK使用HttpPipelinePolicy处理管道逻辑,你需要将原DelegatingHandler的逻辑迁移到HttpPipelinePolicy实现中:

public class CustomErrorPolicy : HttpPipelinePolicy
{
    public override async ValueTask<HttpMessageResponse> ProcessAsync(HttpMessage message, ReadOnlyMemory<HttpPipelinePolicy> pipeline)
    {
        // 执行后续管道获取响应
        var response = await pipeline.First().ProcessAsync(message, pipeline.Slice(1));
        
        // 这里添加原DelegatingHandler中的错误处理逻辑
        if (!response.IsSuccessStatusCode)
        {
            // 示例:自定义错误处理,比如解析错误内容、抛出特定异常
            var errorContent = await response.Content.ToStringAsync();
            throw new InvalidOperationException($"Search request failed: {errorContent}");
        }
        
        return response;
    }
}

如果仍想复用原DelegatingHandler,可以通过HttpPipelinePolicy的适配器包装:

var delegatingHandler = new CustomErrorHandler();
var customPolicy = new HttpPipelineSynchronousPolicy((message) =>
{
    // 同步逻辑处理(如果需要)
})
{
    // 包装异步DelegatingHandler逻辑
    AsyncProcess = async (message, pipeline) =>
    {
        var requestMessage = message.RequestMessage;
        var responseMessage = await delegatingHandler.SendAsync(requestMessage, message.CancellationToken);
        message.ResponseMessage = responseMessage;
        return new HttpMessageResponse(responseMessage);
    }
};

2. 构建包含自定义Policy的HttpPipeline

使用HttpPipelineBuilder创建包含自定义策略的管道,同时保留SDK默认的重试、日志等策略:

var searchOptions = new SearchClientOptions();
// 构建管道:先添加自定义策略,再追加SDK默认的重试/调用策略
var customPipeline = HttpPipelineBuilder.Build(
    searchOptions,
    new CustomErrorPolicy(), // 你的自定义策略
    searchOptions.PerRetryPolicies.ToArray(),
    searchOptions.PerCallPolicies.ToArray()
);

3. 使用自定义管道实例化SearchClient

调用SearchClient带HttpPipeline参数的构造函数,传入自定义管道:

var serviceEndpoint = new Uri("https://your-search-service.search.windows.net");
var indexName = "your-target-index";
var apiKeyCredential = new AzureKeyCredential("your-admin-or-query-key");

var searchClient = new SearchClient(
    serviceEndpoint, 
    indexName, 
    apiKeyCredential, 
    customPipeline
);

注意事项

  • 确保安装的Azure.Search.Documents版本兼容.NET Framework(最低支持.NET Framework 4.6.2),同时配套安装对应版本的Azure.Core包;
  • 自定义策略的执行顺序可以通过调整HttpPipelineBuilder.Build的参数顺序控制,按传入顺序依次执行。

内容的提问来源于stack exchange,提问作者Vlad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:09:54