默认情况下,NEST 直接序列化到请求流并从响应流中反序列化,但这可以在全局或基于每个请求的基础上禁用,以便这些缓存在内存中并在 API 调用详细信息中可用回应
var client = new ElasticClient(settings);
var searchResponse = client.Search<object>(s => s
.RequestConfiguration(r => r
.DisableDirectStreaming()
)
);
var requestJson = Encoding.UTF8.GetString(searchResponse.ApiCall.RequestBodyInBytes);
如果您想查看所有请求和响应,您可能需要在 ConnectionSettings 上设置 DisableDirectStreaming(...) 并配置使用 OnRequestCompleted(...) to print these out 的委托
var defaultIndex = "default_index";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex)
.PrettyJson()
.OnRequestCompleted(callDetails =>
{
if (callDetails.RequestBodyInBytes != null)
{
Console.WriteLine(
$"{callDetails.HttpMethod} {callDetails.Uri} \n" +
$"{Encoding.UTF8.GetString(callDetails.RequestBodyInBytes)}");
}
else
{
Console.WriteLine($"{callDetails.HttpMethod} {callDetails.Uri}");
}
Console.WriteLine();
if (callDetails.ResponseBodyInBytes != null)
{
Console.WriteLine($"Status: {callDetails.HttpStatusCode}\n" +
$"{Encoding.UTF8.GetString(callDetails.ResponseBodyInBytes)}\n" +
$"{new string('-', 30)}\n");
}
else
{
Console.WriteLine($"Status: {callDetails.HttpStatusCode}\n" +
$"{new string('-', 30)}\n");
}
});
var client = new ElasticClient(settings);
var searchResponse = client.Search<object>();
这基本上就是.EnableDebugMode() 上的ConnectionSettings 所做的。
如果您希望能够在发出实际请求的情况下查看请求,则可以使用RequestResponseSerializer 序列化请求
var client = new ElasticClient(settings);
ISearchRequest searchRequest = new SearchDescriptor<object>()
.Query(q => q
.Match(m => m
.Field("foo")
.Query("bar")
)
);
var json = client.RequestResponseSerializer.SerializeToString(searchRequest);
使用这种方法,应将请求转换为请求接口以正确序列化,例如SearchDescriptor<T> -> ISearchRequest.
另一种方法是使用InMemoryConnection
var defaultIndex = "default_index";
var settings = new ConnectionSettings(new InMemoryConnection())
.DefaultIndex(defaultIndex)
.DisableDirectStreaming();
var client = new ElasticClient(settings);
var response = client.Search<object>(s => s
.Query(q => q
.Match(m => m
.Field("foo")
.Query("bar")
)
)
);
var json = Encoding.UTF8.GetString(response.ApiCall.RequestBodyInBytes);
和以前一样,OnRequestCompleted(...) 可以与这种方法一起使用来捕获所有请求。