Windows Server 2019 IIS10下ASMX服务跨域名重定向异常求助
解决ASMX服务重定向导致的SOAP客户端调用问题
核心原因
旧ASP.NET WebForms的SOAP客户端(比如Web引用生成的代理)对HTTP 3xx重定向的处理逻辑不完善:自动跳转时会把重定向响应(text/html类型)当成最终响应解析,而非跟进到新地址获取正确的text/xml SOAP内容,这就是你遇到内容类型不匹配错误的根源。
解决方案
1. 优先使用反向代理(最稳妥)
不要返回重定向,让IIS直接把旧地址的请求转发到新地址,客户端完全感知不到地址变化,拿到的直接是新服务的SOAP响应。
- 确保已安装URL Rewrite和ARR模块,且ARR已启用代理(IIS管理器→服务器节点→Application Request Routing Cache→服务器代理设置→勾选「启用代理」)
- 配置Rewrite规则:
- 匹配URL:
^services/service1.asmx(.*)(针对oldapp.com站点) - 动作类型选择
Rewrite,重写目标设为http://newapp.com/services/service1.asmx{R:1} - 添加条件:
{REQUEST_METHOD} POST(确保SOAP的POST请求也被转发,默认规则可能只处理GET) - 若newapp.com是本地域名,需在服务器hosts文件中添加映射,确保ARR能解析该域名
- 匹配URL:
2. 若必须用重定向,手动处理客户端跳转
放弃AllowAutoRedirect=true,自己捕获重定向响应并重新发起请求:
try { var oldServiceProxy = new Service1SoapClient(); // 尝试调用旧地址 oldServiceProxy.YourSoapMethod(); } catch (WebException ex) { if (ex.Response is HttpWebResponse redirectResp) { // 检查是否是301/302重定向 if (redirectResp.StatusCode is HttpStatusCode.MovedPermanently or HttpStatusCode.Found) { string newServiceUrl = redirectResp.Headers["Location"]; // 用新地址创建代理并重新调用 var newServiceProxy = new Service1SoapClient( new BasicHttpBinding(), new EndpointAddress(newServiceUrl) ); newServiceProxy.YourSoapMethod(); } else { // 非重定向异常,抛出原错误 throw; } } }
3. 排查重定向规则的细节
- 确保规则覆盖POST请求:SOAP调用几乎都是POST,默认Rewrite规则可能只匹配GET,必须添加
{REQUEST_METHOD} POST的条件 - 测试301 vs 302:301是永久重定向,客户端可能缓存旧地址;302是临时,适合过渡阶段,可根据场景选择
4. ARR代理的额外检查
- 确保ARR没有修改SOAP请求的关键头部(如
Content-Type、SOAPAction),可在Rewrite规则中添加preserveHostHeader="true" - 查看IIS日志:确认旧站点的请求被正确转发到新站点,新站点日志是否返回200状态和正确的
text/xml响应
内容的提问来源于stack exchange,提问作者Rocoso
相关产品推荐
相关产品推荐

