IIS部署ASP.NET MVC应用调用API报ordersuat远程名称无法解析如何解决
问题根因
System.Net.WebException: The remote name cannot be resolved: 'ordersuat' 本质是DNS解析失败,和IIS本身配置无关:你本地开发环境的DNS配置可以解析ordersuat内网域名,但部署应用的IIS服务器没有对应的DNS解析规则,你在服务器上执行ping命令返回找不到主机的结果已经验证了这一点。
标准排查步骤
- 登录IIS服务器,打开
C:\Windows\System32\drivers\etc\hosts文件,检查是否有ordersuat对应的IP映射,没有的话手动添加一行:[ordersuat服务的内网IP] ordersuat,保存后执行ipconfig /flushdns刷新DNS缓存即可生效,不需要重启服务器 - 检查IIS服务器的网卡DNS配置,确认是否和你本地使用的内网DNS地址一致,如果是公司内网域名,必须配置内网DNS服务器才能正常解析
- 在IIS服务器上执行
nslookup ordersuat,可以直接查看当前使用的DNS服务器是否能返回正确的解析结果,定位是DNS服务器问题还是本机配置问题
现有代理方案的优化建议
你目前通过defaultProxy配置走代理绕过本地DNS解析的方案可以解决问题,但可以根据实际场景做以下优化:
- 如果
ordersuat是内网服务,优先使用hosts配置/内网DNS解析的方案,不需要走代理链路,既可以降低请求延迟,也可以避免代理节点故障导致接口不可用 - 如果必须使用代理,不要把代理地址硬编码在web.config里,建议放到环境变量、配置中心或者web.config的AppSettings节点,不同部署环境(UAT、生产)可以灵活切换,不需要重新编译或者修改打包后的配置文件
- 现有代码中每次请求都新建
HttpClient实例的写法有问题,高并发场景下会导致socket端口耗尽,建议用单例模式复用HttpClient,如果是.NET Core/.NET 5+环境,直接用框架自带的IHttpClientFactory注入即可 - 不要用
.Result同步等待异步请求,ASP.NET 环境下很容易出现线程死锁,建议把接口逻辑改成异步方法,用await关键字等待PostAsync的返回结果,参考写法:
HttpResponseMessage response = await httpClient.PostAsync(url, encodedRequest);
- 如果是.NET Core/.NET 5+环境,不需要在web.config里配置全局代理,可以在注入HttpClient的时候单独为这个接口客户端配置代理,避免全局代理影响其他外部接口请求:
services.AddHttpClient("OrderApiClient", client => { client.BaseAddress = new Uri("http://ordersuat/"); }).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { Proxy = new WebProxy("http://[代理服务器IP]:[代理端口]/", false), UseProxy = true });
内容的提问来源于stack exchange,提问作者Shaun Falconer
相关产品推荐
相关产品推荐

