我试图通过手动创建HTTP请求来调用基于SOAP的WCF Web服务。我需要这样做,因为我试图在一个具有HTTP访问权限的环境中实现它,而不是WCF服务客户端的东西。它实际上是用不同的语言实现的,但我试图先在C#中进行概念验证。
WCF服务有一个简单的函数,它接受一个字符串地址,然后返回一个带有地址的地理编码信息的复杂对象。现在,我只是在寻找它以字符串形式返回正确的响应。实际上,它返回描述WSDL发现的HTML,因此调用无效。
我从实际正常运行的服务调用中提取SOAP消息(我编写了一些代码来拦截并在SOAP消息出来之前将其解压缩。)
所以现在的诀窍就是让其余的HTTP工作。所以我的代码如下:
string soap = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
" <s:Header>" +
" <Action s:mustUnderstand=\"1\" xmlns=\"http://schemas.microsoft.com/ws/2005/05/addressing/none\">http://tempuri.org/IGeoCode/GetLocation</Action>" +
" </s:Header>" +
" <s:Body>" +
" <GetLocation xmlns=\"http://tempuri.org/\">" +
" <address>1600 Pennsylvania Ave NW, Washington, DC 20500</address>" +
" </GetLocation>" +
" </s:Body>" +
" </s:Envelope>";
var obj = new XMLHTTP60();
obj.open("POST", @"http://MyServer:4444/GeoCode.svc");
obj.setRequestHeader("Content-Type", "text/xml");
obj.setRequestHeader("SOAPAction", "http://MyServer:4444/GeoCode.svc");
obj.setRequestHeader("Content-Length", soap.Length.ToString());
obj.send(soap);
string stat = obj.statusText;
string str = obj.responseText;
string resp = obj.getAllResponseHeaders();
我期待的回归是:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body>
<GetLocationResponse xmlns="http://tempuri.org/">
<GetLocationResult xmlns:a="http://schemas.datacontract.org/2004/07/GeoCodeSvc" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
...
Lots of stuff here
...
</GetLocationResult>
</GetLocationResponse>
</s:Envelope>
</s:Body>
相反,我收到400(错误请求)状态。
答案 0 :(得分:1)
我认为你的问题在于SOAPAction语句。您不想将其指向您的服务。相反,它应该是WSDL所谓的终点。
如果您喜欢冒险,那么终点通常是WSDL中最后一个条目之一。我不记得他们使用的具体术语,但它应该是显而易见的。
HTH,Jim