概述
客户端使用抽象的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);
这里,使用分别接收IConnectionPool
和IConnection
两个参数的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;
}
}
发表评论
登录用户才能发表评论, 请 登 录 或者 注册