使用SOAP消息手动调用Web服务

时间:2017-01-10 15:30:50

标签: wcf soap

我试图通过手动创建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(错误请求)状态。

1 个答案:

答案 0 :(得分:1)

我认为你的问题在于SOAPAction语句。您不想将其指向您的服务。相反,它应该是WSDL所谓的终点。

如果您喜欢冒险,那么终点通常是WSDL中最后一个条目之一。我不记得他们使用的具体术语,但它应该是显而易见的。

HTH,Jim