Skip to content

环境

系统: 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

这样对内网地址就会直连。