You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C# .NET Core在本地OpenSearch中存取文档?

解决C# .NET Core连接OpenSearch的证书与404问题

核心问题分析

  1. 证书验证错误:本地Docker部署的OpenSearch默认使用自签名证书,.NET默认会拒绝这类证书,导致RemoteCertificateNameMismatch错误。
  2. 404错误:你的错误日志显示请求的是/students/_doc/1,但代码里定义的索引名是pmg-students,要么是代码中索引名未正确传递,要么是客户端与服务端版本不兼容导致索引创建失败。

分步解决方案

1. 正确配置OpenSearch客户端(解决证书+认证问题)

本地POC场景下,直接禁用证书验证并配置默认账号密码,同时优化客户端初始化方式:

using OpenSearch.Client;
using Microsoft.AspNetCore.Mvc;

public class OpenSearchController : ControllerBase
{
    private const string _username = "admin";
    private const string _password = "admin";
    private const string _indexName = "pmg-students";
    private const string _opensearchUrl = "https://localhost:9200";

    private readonly IOpenSearchClient _client;

    // 通过构造函数初始化客户端,避免每次请求重复创建实例
    public OpenSearchController()
    {
        var node = new Uri(_opensearchUrl);
        var settings = new ConnectionSettings(node)
            // 禁用所有证书验证(仅POC环境使用,生产环境需配置可信证书)
            .ServerCertificateValidationCallback((sender, cert, chain, sslPolicyErrors) => true)
            // 配置基础认证
            .BasicAuthentication(_username, _password)
            // 设置默认索引,简化后续调用
            .DefaultIndex(_indexName)
            // 开启调试模式,方便查看请求/响应详情
            .DisableDirectStreaming();

        _client = new OpenSearchClient(settings);
    }

    // 新增学生文档
    [HttpPost("add-student")]
    public IActionResult AddStudent([FromBody] Student student)
    {
        // 显式指定索引(也可依赖DefaultIndex省略此参数)
        var response = _client.Index(student, i => i
            .Index(_indexName)
            // 若需自定义文档ID,添加.Id(student.Id),否则OpenSearch自动生成
            .Id(student.Id));

        if (response.IsValid)
        {
            return Ok(new { Message = "文档保存成功", DocumentId = response.Id });
        }
        else
        {
            // 返回错误详情用于调试
            return BadRequest(new { Error = response.ServerError?.Error?.Reason, DebugInfo = response.DebugInformation });
        }
    }

    // 根据ID获取学生文档
    [HttpGet("get-student/{id}")]
    public IActionResult GetStudent(string id)
    {
        var response = _client.Get<Student>(id, g => g.Index(_indexName));

        if (response.IsValid)
        {
            return Ok(response.Source);
        }
        else
        {
            return NotFound(new { Message = $"未找到ID为{id}的文档", Error = response.ServerError?.Error?.Reason });
        }
    }
}

// Student实体类(确保属性可被JSON序列化)
public class Student
{
    public string Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Grade { get; set; }
}

2. 排查404错误的关键要点

  • 索引名一致性:确保代码中所有指定索引的地方都使用同一名称(比如你的pmg-students),避免拼写错误。
  • 版本兼容性:检查Docker部署的OpenSearch服务端版本与OpenSearch.Client版本是否匹配:
    • OpenSearch 1.x 对应 OpenSearch.Client 1.x
    • OpenSearch 2.x 对应 OpenSearch.Client 2.x
      版本不匹配会导致索引创建、文档操作失败,返回404。
  • 手动创建索引(可选):如果自动创建索引失败,可先在OpenSearch Dashboard中手动创建pmg-students索引,再执行代码。

3. 额外调试技巧

  • 开启DisableDirectStreaming()后,可通过response.DebugInformation查看完整的请求和响应内容,精准定位错误。
  • 用Postman直接调用OpenSearch API(PUT https://localhost:9200/pmg-students/_doc/1,携带Basic Auth),验证服务端是否正常响应,排除代码之外的问题。

内容的提问来源于stack exchange,提问作者phougatv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:27:40