如何用C# .NET Core在本地OpenSearch中存取文档?
解决C# .NET Core连接OpenSearch的证书与404问题
核心问题分析
- 证书验证错误:本地Docker部署的OpenSearch默认使用自签名证书,.NET默认会拒绝这类证书,导致
RemoteCertificateNameMismatch错误。 - 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
相关产品推荐
相关产品推荐

