WebAPI对Elasticsearch NEST查询的JsonResult响应

时间:2018-08-22 17:26:41

标签: elasticsearch asp.net-web-api nest elasticsearch-5

我创建了WEBAPI方法,以使用NEST搜索ES。使用ES进行的搜索按预期进行。我遇到的问题是,当我尝试使用POSTMAN返回Json(response)时,它引发了此异常:

  

{       “ Message”:“发生错误。”,       “ ExceptionMessage”:“如果您使用自定义合同解析器,请确保从ElasticContractResolver继承子类”,       “ ExceptionType”:“ System.Exception”,       “ StackTrace”:“在Nest.JsonExtensions.GetConnectionSettings(JsonSerializer   序列化器)\ r \ n位于   Nest.VerbatimDictionaryKeysJsonConverter 2.WriteJson(JsonWriter writer, Object value, JsonSerializer serializer)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeConvertable(JsonWriter writer, JsonConverter converter, Object value, JsonContract contract, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)\r\n at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)\r\n at System.Web.Http.Results.JsonResult 1.Serialize()\ r \ n at   System.Web.Http.Results.JsonResult 1.Execute()\r\n at System.Web.Http.Results.JsonResult 1.ExecuteAsync(CancellationToken   cancelToken)\ r \ n位于   System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\ r \ n ---   从先前引发异常的位置开始的堆栈跟踪结束   --- \ r \ n在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)\ r \ n   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)\ r \ n   System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\ r \ n ---   从先前引发异常的位置开始的堆栈跟踪结束   --- \ r \ n在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)\ r \ n   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)\ r \ n   System.Web.Http.Controllers.AuthenticationFilterResult.d__0.MoveNext()\ r \ n ---   从先前引发异常的位置开始的堆栈跟踪结束   --- \ r \ n在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)\ r \ n   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)\ r \ n   System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()“   }

这是我的WEB API方法

[System.Web.Http.Route("SearchElastic")]
[System.Web.Http.HttpPost]

public JsonResult<ISearchResponse<T>> SearchElastic([FromBody] ElasticSearchRequest esRequest)
{
    var searchResponse = EsClient.Search<T>(
        "...NEST query..."
                ));

    return Json(searchResponse);
}

//<T> is a custom C# class.

我正在使用Elasticsearch / NEST5.x。

1 个答案:

答案 0 :(得分:0)

错误消息提示问题是什么

  

{“ Message”:“发生错误。”,“ ExceptionMessage”:“如果使用   自定义合同解析器,请确保从   ElasticContractResolver“,” ExceptionType“:” System.Exception“,   “ StackTrace”:“位于...

与行有关

    return Json(searchResponse);

Web API使用的Json序列化程序的配置不知道如何处理来自NEST的某些类型的序列化,因为其中某些类型需要ElasticContractResolver才能正确序列化。

有几种解决方法,但是最简单的两种是:

  1. 使用ElasticContractResolver作为JsonSerializerSettings上的IContractResolver,配置Web API使用的Json序列化程序。这里的缺点是,您要序列化为json的所有类型都将通过NEST的解析器

  2. 通过使用低级客户端从Elasticsearch返回字符串或字节数组,完全避免来自Elasticsearch的反序列化/重新序列化循环->由NEST反序列化->由Web API重新序列化。如果您不对searchResponse进行任何自省,则建议使用此方法。如果确实需要检查searchResponse,则始终可以将字符串或字节数组反序列化为SearchResponse<T>,这是一个单独的步骤。

这是direct dependency on Json.NET has been removed in NEST 6.x

的原因之一