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

JS调用SOAP POST请求返回400 Bad Request问题求助

解决WCF SOAP POST请求400 Bad Request的问题

看起来你遇到的问题主要来自两个方面:异步请求的状态判断时机错误,以及SOAP消息本身的语法问题,咱们一步步来修正:

1. 先解决异步请求的状态判断问题

你当前的代码在req.send()之后立刻判断req.status,但因为用的是异步请求(open方法第三个参数是true),此时请求还处于「正在发送」的状态(readyState=1),根本没拿到服务器的响应,所以req.status始终是1。必须通过onreadystatechange事件监听请求完成的状态。

2. 修正SOAP消息的语法错误

你的SOAP消息里有两处明显问题:

  • Envelope标签前缀不匹配:开头用了<soap:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">,结尾却用了</s:Envelope>,前缀要统一;
  • Header里的<Action soap:>是无效语法,而且WCF已经通过请求头的SOAPAction识别调用方法,这个错误的Header节点完全可以删掉。

另外,Content-Type请求头最好加上编码声明,确保服务器正确解析请求内容。

修正后的完整JS代码

function GetNumBossesTest() {
    let req = null;
    if (window.XMLHttpRequest != undefined)
        req = new XMLHttpRequest();
    else {
        req = new ActiveXObject("Microsoft.XMLHTTP"); // 你之前拼写错了Micosoft,这里修正
    }
    
    // 监听请求状态变化,只有请求完成后才处理响应
    req.onreadystatechange = function() {
        if (req.readyState === 4) { // readyState=4表示请求已完成
            if (req.status === 200) {
                alert(req.responseText);
            } else {
                // 方便调试:打印错误状态和响应内容
                console.error(`请求失败,状态码:${req.status}`);
                console.error(`服务器响应:${req.responseText}`);
            }
        }
    };

    req.open("POST", "http://localhost:63748/DistGamingWebService.svc", true);
    req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    req.setRequestHeader("SOAPAction", "http://tempuri.org/IDistGamingWebService/GetNumBosses");
    
    // 修正后的SOAP消息,统一前缀并移除错误的Header节点
    var sMsg = `<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <GetNumBosses xmlns="http://tempuri.org/" />
    </s:Body>
</s:Envelope>`;
    
    req.send(sMsg);
}

额外检查点

如果修正后还是报错,建议对比WCF测试客户端发送的请求(用Fiddler抓包)和JS发送的请求,重点看:

  • 请求头的差异(比如是否有额外的必要头);
  • SOAP消息的命名空间、标签结构是否完全一致;
  • 确认你的WCF服务配置使用的是basicHttpBinding(默认支持SOAP 1.1,对应text/xml的Content-Type),如果用了wsHttpBinding可能需要调整请求格式。

内容的提问来源于stack exchange,提问作者purplerain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:05:46