.Net Core控制器PublishDraft接口测试生产环境报No such host is known错误
.NET Core控制器PublishDraft动作部署后返回"No such host is known"错误排查
我在.Net Core控制器中定义了一个PublishDraft动作,开发阶段在本地localhost运行完全符合预期,但部署到测试或生产服务器后,调用该动作就会返回"No such host is known"错误。
该控制器下有多个动作,除了这个单独的PublishDraft()动作之外,其余所有动作在测试和生产环境都能正常运行,因此可以排除DNS问题。
[HttpPost("PublishDraft")] public async Task<IActionResult> PublishDraft([FromBody] PublishDraftRequest request) { try { var existing = _unitOfWork.Drafts.GetAll(d => d.Id == request.DraftId, null, "DraftTags").FirstOrDefault(); if (existing == null) { return NotFound("Draft does not exist"); } var created = await _unitOfWork.Drafts.PublishDraft(existing, User.Claims.GetUserId()); if (created.TreeNodeTypeId == (int)TreeNodeTypes.Private && created.ParentId != null) { await _unitOfWork.TreeNodeUser.UpdateUserPermissionsAsync(created.Id, created.ParentId, User.Claims.GetUserId()); } return Created("TreeNode", created); } catch (Exception ex) { logger.LogError(ex, User); return BadRequest(ex.Message); } }
无论是使用Angular web客户端还是PostMan在测试、生产环境测试,调用这个单独的动作都会返回同样的错误,服务器环境为IIS 10。
排查更新
- 针对异常调用栈的疑问:最初没有捕获到任何异常,曾判断控制器动作未被命中,因此没有异常日志输出。
- 补充异常现象:只有传入的DraftId真实存在时才会返回"unknown host"错误,如果传入无效的DraftId,会正常返回"Draft does not exist"的错误提示,说明控制器动作实际上是被命中了的。后续通过添加链路日志定位问题出现的具体位置。
问题已解决(2021年9月9日)
问题根源为环境配置不统一,最终定位是外部API端点地址末尾缺少斜杠导致。
服务需要在PublishDraft()动作内部通过HttpClient调用外部API,本地localhost的appSettings中的端点基础地址配置如下:
"EndPointsConfig": { "FileStore": "https://localhost:44314/" }
该配置末尾的斜杠是正确的。
但测试和生产环境的appSettings配置如下:
"EndPointsConfig": { "FileStore": "https://filestore.domain.com" }
末尾缺少斜杠导致了"No such host is known"错误,因为拼接接口路径时没有斜杠会生成错误的地址,比如会变成https://filestore.domain.com/deleterange,添加末尾斜杠后问题就完全解决了。
内容的提问来源于stack exchange,提问作者King Wilder
相关产品推荐
相关产品推荐

