我创建了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.JsonResult1.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。
答案 0 :(得分:0)
错误消息提示问题是什么
{“ Message”:“发生错误。”,“ ExceptionMessage”:“如果使用 自定义合同解析器,请确保从 ElasticContractResolver“,” ExceptionType“:” System.Exception“, “ StackTrace”:“位于...
与行有关
return Json(searchResponse);
Web API使用的Json序列化程序的配置不知道如何处理来自NEST的某些类型的序列化,因为其中某些类型需要ElasticContractResolver
才能正确序列化。
有几种解决方法,但是最简单的两种是:
使用ElasticContractResolver
作为JsonSerializerSettings
上的IContractResolver
,配置Web API使用的Json序列化程序。这里的缺点是,您要序列化为json的所有类型都将通过NEST的解析器
通过使用低级客户端从Elasticsearch返回字符串或字节数组,完全避免来自Elasticsearch的反序列化/重新序列化循环->由NEST反序列化->由Web API重新序列化。如果您不对searchResponse
进行任何自省,则建议使用此方法。如果确实需要检查searchResponse
,则始终可以将字符串或字节数组反序列化为SearchResponse<T>
,这是一个单独的步骤。
这是direct dependency on Json.NET has been removed in NEST 6.x
的原因之一