ESP32调用远程IIS部署的ASP.NET Web API返回错误码-1求助
ESP32调用远程IIS上ASP.NET Web API返回错误码-1排查方案
错误码-1在ESP32的HTTPClient库中代表连接建立失败,结合你电脑浏览器能正常访问的情况,按以下步骤排查:
1. 域名解析问题
ESP32的默认DNS服务器可能无法解析rmhq-routenet这个域名,而电脑使用的DNS(比如路由器或运营商DNS)可以正常解析。
- 临时测试:把URL中的域名替换成API服务器的公网IP地址,比如
http://xxx.xxx.xxx.xxx/testapi/weatherforecast,如果能正常获取响应,说明是DNS问题。 - 永久解决:在WiFi连接成功后,指定可靠的DNS服务器(如谷歌DNS 8.8.8.8),代码中添加:
WiFi.config(INADDR_NONE, INADDR_NONE, IPAddress(8, 8, 8, 8));
2. 服务器防火墙/IP白名单限制
IIS服务器的防火墙可能只允许特定IP段(比如你电脑所在的局域网或办公网络)访问,ESP32的公网IP不在允许列表内。
- 排查方法:临时关闭服务器防火墙,测试ESP32能否访问;或者在防火墙规则中开放80端口(如果API用默认HTTP端口)给ESP32的公网IP。
- 注意:如果服务器在企业内网,还要确认ESP32所在网络能穿透到服务器的网络环境,没有NAT或代理限制。
3. 请求头缺失导致服务器拒绝
电脑浏览器会自动添加User-Agent等标准请求头,而ESP32的请求头过于简洁,部分API会以此判断请求合法性并拒绝。
- 解决:在代码中添加
User-Agent请求头:http.addHeader("User-Agent", "ESP32-HTTPClient");
4. 端口号未明确指定
如果API没有使用HTTP默认的80端口,URL中必须明确标注端口号(比如http://rmhq-routenet:8080/testapi/weatherforecast),电脑浏览器可能通过缓存或自动跳转处理,但ESP32无法自动识别。
5. 验证WiFi连接有效性
虽然代码显示WiFi已连接,但可能存在虚假连接(比如获取到IP但无法访问外网)。在setup中添加代码打印设备IP:
Serial.print("Local IP: "); Serial.println(WiFi.localIP());
同时可以在ESP32上尝试访问公共API(比如http://httpbin.org/get),验证HTTPClient功能是否正常。
修改后的测试代码
#include "WiFi.h" #include "HTTPClient.h" const int32_t LED_BUILTIN = 2; const char* SSID = "你的WiFi名称"; const char* PASSWORD = "你的WiFi密码"; void setup() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); WiFi.begin(SSID, PASSWORD); while(WiFi.status() != WL_CONNECTED){ delay(500); Serial.print("-"); } // 指定DNS服务器解决解析问题 WiFi.config(INADDR_NONE, INADDR_NONE, IPAddress(8, 8, 8, 8)); Serial.println(""); Serial.println("Wifi Connected"); Serial.print("Local IP: "); Serial.println(WiFi.localIP()); digitalWrite(LED_BUILTIN, HIGH); } void loop() { if(WiFi.status() == WL_CONNECTED){ HTTPClient http; // 优先用IP测试,替换成你的服务器IP http.begin("http://rmhq-routenet/testapi/weatherforecast"); http.addHeader("Accept", "application/json"); // 添加User-Agent头 http.addHeader("User-Agent", "ESP32-HTTPClient"); int response_code = http.GET(); if(response_code > 0){ Serial.print("Response Code: "); Serial.println(response_code); String response_data = http.getString(); Serial.print("Response Data: "); Serial.println(response_data); } else{ Serial.print("Error Code: "); Serial.println(response_code); // 打印详细错误描述 Serial.print("Error Details: "); Serial.println(http.errorToString(response_code)); } http.end(); } delay(5000); // 延长请求间隔,避免服务器限流 }
内容的提问来源于stack exchange,提问作者Ayayron
相关产品推荐
相关产品推荐

