You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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能解析该域名

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 13:07:26