如何解决在 IActionResult 中使用 c# API ControllerBase 时,Elasticsearch NEST 不返回 Hits
我一直在关注 NuSearch 示例应用程序并通过添加 API 控制器而不是默认的 MVC 视图来返回数据进行测试。当我使用 API 控制器返回数据时,his - source 填充在模型中(Hits 源是从 elasticsearch 返回的,可以在 fiddler 和 locals 检查中看到),但它们没有序列化到客户端。 这是我添加到同一个项目中的 API 控制器,它使用与 MVC 控制器相同的查询:
[Route("api/[controller]")]
[ApiController]
public class APISearchController : ControllerBase
{
private readonly IElasticclient _client;
public APISearchController(IElasticclient client) => _client = client;
[HttpGet]
public ActionResult<Searchviewmodel> Index([FromQuery] SearchForm form)
{
var result = _client.Search<Package>(s => s
.From((form.Page - 1) * form.PageSize)
.Size(form.PageSize)
.sort(sort =>
//....... code cut for berevity -
var authors = result.Aggregations.nested("authors")
.Terms("author-names")
.Buckets
.ToDictionary(k => k.Key,v => v.DocCount);
var model = new Searchviewmodel
{
Hits = result.Hits,Total = result.Total,Form = form,TotalPages = (int)Math.Ceiling(result.Total / (double)form.PageSize),Authors = authors
};
return Ok(model);
}
}
为什么点击 - 源没有被序列化到返回的 JSON 中?
{
"form": {
"page": 1,"significance": false,"query": "test","author": null,"tags": [],"pageSize": 10,"sort": 0
},"total": 3162,"totalPages": 317,"hits": [
{
"explanation": null,"fields": null,"highlight": {},"innerHits": {},"matchedQueries": [],"nested": null,"score": 10538.628,"sorts": []
},{
"explanation": null,.........
? model
{NuSearch.Web.Models.Searchviewmodel}
Authors: Count = 10
ElapsedMilliseconds: 0
Form: {NuSearch.Web.Models.SearchForm}
Hits: {nest.IHit<NuSearch.Domain.Model.Package>[10]}
Results: null
Tags: Count = 0
Total: 3162
TotalPages: 317
? model.Hits
{nest.IHit<NuSearch.Domain.Model.Package>[10]}
[0]: {nest.Hit<NuSearch.Domain.Model.Package>}
[1]: {nest.Hit<NuSearch.Domain.Model.Package>}
[2]: {nest.Hit<NuSearch.Domain.Model.Package>}
[3]: {nest.Hit<NuSearch.Domain.Model.Package>}
[4]: {nest.Hit<NuSearch.Domain.Model.Package>}
[5]: {nest.Hit<NuSearch.Domain.Model.Package>}
[6]: {nest.Hit<NuSearch.Domain.Model.Package>}
[7]: {nest.Hit<NuSearch.Domain.Model.Package>}
[8]: {nest.Hit<NuSearch.Domain.Model.Package>}
[9]: {nest.Hit<NuSearch.Domain.Model.Package>}
? model.Hits.ElementAt(0)
{nest.Hit<NuSearch.Domain.Model.Package>}
Explanation: null
Fields: null
Highlight: Count = 0
Id: "Test"
Index: "nusearch-04-02-2021-14-25-50"
InnerHits: Count = 0
MatchedQueries: Count = 0
nested: null
PrimaryTerm: null
Routing: null
score: 10538.628
SequenceNumber: null
Sorts: Count = 0
Source: {NuSearch.Domain.Model.Package}
Type: "_doc"
Version: 0
? model.Hits.ElementAt(0).source
{NuSearch.Domain.Model.Package}
AllVersionsUnlisted: false
Authors: Count = 1
copyright: ""
DownloadCount: 3073
IconUrl: ""
Id: "Test"
Suggest: {nest.CompletionField}
Summary: "Test Nuget."
Tags: {string[0]}
Versions: Count = 1
编辑:添加了返回给客户端的示例 json: 编辑:从立即窗口添加了更多模型细节
解决方法
很可能是 ASP.NET (Core) 用于返回 JSON 的 JSON 序列化程序不知道如何序列化 result.Hits
,它是一个 IReadOnlyCollection<IHit<Package>>
。
有几种方法可以解决这个问题:
- 您可以告诉 ASP.NET (Core) 使用的 JSON 序列化程序如何序列化
IHit<T>
,例如JsonConverter
或
- 将所需的命中数据提取为序列化程序可以序列化的类型
或
- 通过全局或每个请求设置
.DisableDirectStreaming()
来捕获从 Elasticsearch 返回的响应字节,并返回这些
或
- 如果您不需要处理反序列化的响应,可以使用暴露在高层客户端上的低层客户端发送请求,返回一个字符串/字节数组,并直接返回。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。