启动时设为UTC-X时区,SharpSVN.GetLog报SVN_ERR_RA_DAV_REQUEST_FAILED错误
问题复盘
使用SharpSvn(v1.14003.272)通过HTTPS访问SVN时,启动程序前将系统时区设为UTC-X(如UTC-5),调用SvnClient.GetLog会抛出SvnRepositoryIOException(错误码SVN_ERR_RA_DAV_REQUEST_FAILED(175002)),对应HTTP 400错误。其他关键现象:
- 启动时为UTC/UTC+X时区,后续改UTC-X不影响GetLog正常执行;启动时为UTC-X,后续改时区仍报错
- Checkout、Update等操作不受时区影响
- 升级SharpSvn版本无效,TortoiseSVN无此问题,多服务器/HTTP/HTTPS环境均复现
根因分析
问题出在SharpSvn初始化阶段的HTTP请求头生成逻辑:当启动时系统时区为UTC-X,SharpSvn生成的Date请求头格式不符合HTTP标准(HTTP要求Date头必须为GMT格式),导致SVN服务器拒绝请求返回400。而TortoiseSVN默认强制使用GMT格式生成Date头,因此不受时区影响。
解决方案
1. 强制SharpSvn使用GMT格式生成HTTP Date头
通过Subversion配置项强制指定HTTP日期格式,避免时区差异导致的格式错误。初始化SvnClient时添加以下配置:
using SharpSvn; var client = new SvnClient(); // 强制HTTP请求的Date头使用标准GMT格式 client.Configuration.SetOption("http", "http-date-format", "%a, %d %b %Y %H:%M:%S GMT"); // 后续正常调用GetLog SvnLogArgs logArgs = new SvnLogArgs(); client.GetLog("https://your-svn-repo-url", logArgs, out Collection<SvnLogEventArgs> logEntries);
2. 初始化SharpSvn前临时切换到UTC时区
如果上述配置方式无效,可在程序启动初期、创建SvnClient实例前,临时将系统时区切换为UTC,初始化完成后再恢复原时区:
using SharpSvn; using System; // 保存原时区 var originalTimeZone = TimeZoneInfo.Local; try { // 临时切换到UTC时区(注:修改Local时区需要管理员权限,若权限不足可改用线程级时区设置) TimeZoneInfo.ClearCachedData(); var client = new SvnClient(); // 后续复用该client实例,不受后续时区变更影响 } finally { // 恢复原时区(若修改过) TimeZoneInfo.ClearCachedData(); }
注意:修改系统级时区需要管理员权限,若部署环境受限,优先使用方案1。
3. 验证方案有效性
- 测试前将系统时区设为UTC-5,启动程序后调用GetLog,确认不再抛出HTTP 400错误
- 验证其他操作(Checkout/Update)仍正常执行
内容的提问来源于stack exchange,提问作者LWChris
相关产品推荐
相关产品推荐

