.NET Core 3.1 SOAP请求非Fiddler环境返回403/500问题求助
使用.NET Core 3.1通过HttpWebRequest向仅允许白名单IP访问的外部SOAP服务发送请求,我方VPN IP已在白名单内,但出现以下异常现象:
- 直接通过Visual Studio调试或Postman发送请求时,被外部服务拒绝,返回
403 Unauthorized或500 Internal Server Error - 开启Fiddler后发送相同请求,可正常返回
200 OK
两种场景的响应信息如下:
未通过Fiddler
状态码:500 Internal Server Error
HTTP版本:HTTP/1.1
传输大小:408 B(内容大小233 B)
Referrer Policy:strict-origin-when-cross-origin
请求优先级:Highest
响应头:
Content-Type: application/json
Date: Thu, 28 Jul 2022 08:42:32 GMT
Server: Kestrel
Transfer-Encoding: chunked
X-Powered-By: ASP.NET
通过Fiddler
状态码:200 OK
HTTP版本:HTTP/1.1
传输大小:1.57 KB(内容大小1.41 KB)
Referrer Policy:strict-origin-when-cross-origin
请求优先级:Highest
响应头:
Content-Type: text/plain; charset=utf-8
Date: Thu, 28 Jul 2022 09:01:24 GMT
Server: Kestrel
Transfer-Encoding: chunked
X-Powered-By: ASP.NET
1. 请求头部/编码不匹配
直接发送请求时,HttpWebRequest或Postman的默认头部设置不符合外部SOAP服务的要求,比如:
- 未正确设置SOAP请求标准的
Content-Type(应为text/xml; charset=utf-8或application/soap+xml),而Fiddler转发时自动修正了该头部 Host头格式不正确,或者缺少服务端预期的其他自定义头部
2. 出口IP未走VPN
虽然已连接VPN,但本地请求的路由规则可能未强制目标服务的流量走VPN网卡,导致直接发送时出口IP不是白名单内的VPN IP;而Fiddler作为代理,强制请求通过系统代理(VPN)转发,使用了正确的白名单IP。
3. SOAP请求体格式错误
直接发送的SOAP信封存在格式、命名空间或编码错误,Fiddler在转发时自动修正了这些问题(比如调整换行、编码格式),使得服务端能正常解析。
1. 修正请求头部配置
手动指定SOAP请求所需的标准头部,示例代码:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("外部服务URL"); request.Method = "POST"; // 设置SOAP请求标准Content-Type request.ContentType = "text/xml; charset=utf-8"; // 明确指定Host头,与目标服务域名一致 request.Host = "目标服务域名"; // 若服务端需要其他自定义头部,补充添加 request.Headers.Add("自定义头部键", "自定义头部值");
2. 强制请求走VPN代理
配置HttpWebRequest使用代理,确保请求通过VPN路由出口:
// 使用Fiddler代理(临时验证用) request.Proxy = new WebProxy("127.0.0.1:8888"); // 生产环境可直接配置VPN代理地址 // request.Proxy = new WebProxy("VPN代理IP:端口"); // 若不需要代理凭据,可跳过以下设置 request.Proxy.Credentials = CredentialCache.DefaultCredentials;
3. 校验并修正SOAP请求体
用Fiddler抓取通过代理成功发送的请求体,对比直接发送的请求体,修正格式、命名空间或编码问题:
- 确保SOAP信封的XML结构完整、命名空间正确
- 确认请求体编码为
utf-8,无乱码或多余字符
4. 调整系统路由规则
通过tracert 目标服务域名命令检查请求路由路径,若未走VPN:
- 在VPN客户端设置中,添加目标服务的网段为强制走VPN的路由
- 或手动添加系统路由规则,指定目标服务IP段走VPN网卡
内容的提问来源于stack exchange,提问作者user3552264

