问题描述
使用微软API管理服务(Azure API Management),简称APIM。 因为公司策略要求只能内部网络访问,所以启用了VNET集成。集成方式见: (在内部模式下使用 Azure API 管理连接到虚拟网络:https://docs.azure.cn/zh-cn/api-management/api-management-using-with-internal-vnet?tabs=stv1)
当APIM配置好后,直接通过CURL命令访问APIM的网关接口(如:curl https://bei3apim.azure-api.cn/httpbin/get -v ),请求响应成功。
但是,直接在门户上访问时,为什么一直都报错 “Could not complete the request. Please try again later.”
问题分析
首先,请求通过APIM 网关已经能成功转发请求到后端服务器,并且返回状态为200。获得正确的返回结果。
然后,这个问题,只发生在APIM门户的 Test 页面,并且当点击“Test” 按钮后,马上就触发了API 管理提示的错误。
所以,判断这个问题,就发生在APIM门户页面端,是JS的一些执行报错。所以可以通过浏览器开发模式(F12)查看,Console中的输出,检测JS执行的错误消息。
谜底揭晓:因为APIM的Test功能是把请求先发送到一个代理服务器( https://apimanagement-cors-proxy-mc.azure-api.cn/ )上执行,而在内网中,这个代理服务器URL无法被解析。
解决方法:在虚拟网络的DNS服务器中,加上对域名(apimanagement-cors-proxy-mc.azure-api.cn)的解析。或者直接在当前的VM中修改windows host文件(C:\Windows\System32\drivers\etc)
解题步骤
1) 在公网中,通过 nslookup apimanagement-cors-proxy-mc.azure-api.cn 解析出它的IP地址
2) 进入VM 的Host文件,添加 IP 域名记录
3) 刷新APIM Test页面,再次点击Test Send 按钮,请求发送成功!
[END]
参考资料
在内部模式下使用 Azure API 管理连接到虚拟网络:https://docs.azure.cn/zh-cn/api-management/api-management-using-with-internal-vnet?tabs=stv1