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
相关产品推荐
相关产品推荐

