在 IActionResult 中使用 c# API ControllerBase 时,Elasticsearch NEST 不返回 Hits

如何解决在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?