更改默认的连接配置

1016 发布于: 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;
    }
}

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

发表评论

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