环境
系统: window 系统环境变量http和https已经设置 webdav客户端为webdav_client
Unhandled exception: DioException [bad response]:
null Error:
Service Unavailable #0 WdDio.wdPropfind (package:webdav_client/src/webdav_dio.dart:191:7) <asynchronous suspension> #1 Client.readDir (package:webdav_client/src/client.dart:66:16) <asynchronous suspension> #2 main (package:firest/test.dart:12:14) <asynchronous suspension>
日志里返回头里出现了
proxy-connection: close
说明请求其实是跑到了 系统代理 上,而不是直接连到本地的 webdav
服务,所以代理没法正确处理 PROPFIND
→ 直接回了 503 Service Unavailable
。
解决方法
方案 1:关闭系统代理
最简单,直接关掉 Windows / macOS / Linux 的全局代理,再跑代码,Dart 就能直连webdav服务ip地址。
方案 2:跳过代理
在 Dart 里设置环境变量,告诉 http
/dio
不要代理局域网:
dart
import 'dart:io';
void main() {
// 禁用全部代理
HttpOverrides.global = _NoProxyHttpOverrides();
// 或者仅对 192.168.* 地址禁用代理:
// 也可以通过环境变量控制
HttpOverrides.global = _CustomProxyOverrides();
}
class _NoProxyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..findProxy = (uri) {
return "DIRECT"; // 永远直连
};
}
}
class _CustomProxyOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..findProxy = (uri) {
if (uri.host.startsWith("192.168.")) {
return "DIRECT"; // 局域网直连
}
return "PROXY yourproxy:port"; // 其他走代理
};
}
}
这样,你的 webdav_client
里走的 dio
请求就不会再被系统代理拦截了。
方案 3:环境变量控制代理
Dart/Flutter 默认会读取这些环境变量:
http_proxy
https_proxy
no_proxy
如果你设置了全局代理,可以加:
bash
set no_proxy= webdav服务ip地址 ,localhost,127.0.0.1
或者 Linux/macOS:
bash
export no_proxy=webdav服务ip地址,localhost,127.0.0.1
这样对内网地址就会直连。