更改默认的连接配置

1110 发布于: 2021-04-01 读完约需 3 分钟

概述

客户端使用抽象的IConnection来发送请求和创建响应,具体的默认实现是基于System.Net.Http.HttpClient的。

下面,让我们使用几个例子来看看为什么要传递自己的连接呢?

使用InMemoryConnection

InMemeoryConnection是一个内置的用于单元测试的IConnection实现。它可以配置为在调用时使用默认响应字节、HTTP状态代码和异常进行响应。

InMemoryConnection不会真正地发送任何请求到Elasticsearch服务,也不会地从Elasticsearch服务接收到任何真正的响应。但请求仍然是序列化的,如果.DisableDirectStreaming在请求中或全局被设置为了true,则可以在响应中获得请求字节。

登录后复制
var connection = new InMemoryConnection(); var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); var settings = new ConnectionSettings(connectionPool, connection); var client = new ElasticClient(settings);

这里,使用分别接收IConnectionPoolIConnection两个参数的ConnectionSettings创建了一个实例。InMemoryConnection使用的是无参构造函数,它将始终返回200而不执行任何IO操作。

让我们再看一下更复杂的示例:

登录后复制
var response = new { took = 1, timed_out = false, _shards = new { total = 2, successful = 2, failed = 0 }, hits = new { total = new { value = 25 }, max_score = 1.0, hits = Enumerable.Range(1, 25).Select(i => (object)new { _index = "project", _type = "project", _id = $"Project {i}", _score = 1.0, _source = new { name = $"Project {i}" } }).ToArray() } }; var responseBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(response)); var connection = new InMemoryConnection(responseBytes, 200); // InMemoryConnection被配置为总是返回responseBytes以及一个200 HTTP状态码 var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); var settings = new ConnectionSettings(connectionPool, connection).DefaultIndex("project"); var client = new ElasticClient(settings); var searchResponse = client.Search<Project>(s => s.MatchAll());

我们现在可以断言searchResponse是有效的,并且包含从固定的InMemoryConnection响应中反序列化的文档:

登录后复制
searchResponse.ShouldBeValid(); searchResponse.Documents.Count.Should().Be(25);

更改HttpConnection

有时候你可能需要更改HttpConnection默认的工作方式,比如:向请求中添加X509证书,修改端点允许的最大连接数等。

你可以创建一个派生自HttpConnection的自定义实现,并重写CreateRequestMessage方法来改变HttpConnection的默认配置,如下:

登录后复制
public class MyCustomHttpConnection : HttpConnection { protected override HttpRequestMessage CreateRequestMessage(RequestData requestData) { var message = base.CreateRequestMessage(requestData); var header = string.Empty; message.Headers.Authorization = new AuthenticationHeaderValue("Negotiate", header); return message; } } public class KerberosConnection : HttpConnection { protected override HttpRequestMessage CreateRequestMessage(RequestData requestData) { var message = base.CreateRequestMessage(requestData); var header = string.Empty; message.Headers.Authorization = new AuthenticationHeaderValue("Negotiate", header); return message; } }

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

发表评论

登录用户才能发表评论, 请 登 录 或者 注册