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
相关产品推荐
相关产品推荐

