Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 使用SOAP消息手动调用web服务_Wcf_Soap - Fatal编程技术网

Wcf 使用SOAP消息手动调用web服务

Wcf 使用SOAP消息手动调用web服务,wcf,soap,Wcf,Soap,我试图通过手动创建HTTP请求来调用基于SOAP的WCF web服务。我之所以需要这样做,是因为我正试图在一个可以访问HTTP的环境中实现它,而不是WCF服务客户端。它实际上是用另一种语言实现的,但我想先用C#做一个概念证明 WCF服务有一个简单的函数,它接受一个字符串地址,然后返回一个包含地址地理编码信息的复杂对象。现在,我只是希望它以字符串的形式返回正确的响应。实际上,它返回描述WSDL发现的HTML,因此调用不起作用 我从一个实际运行的服务调用中提取了SOAP消息(我编写了一些代码,在SO

我试图通过手动创建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();
string soap=“”+
"   " +
"     http://tempuri.org/IGeoCode/GetLocation" +
"   " +
"   " +
"     " +
华盛顿特区宾夕法尼亚大道西北1600号,邮编20500+
"     " +
"   " +
" ";
var obj=新的XMLHTTP60();
对象打开(“POST”、@”http://MyServer:4444/GeoCode.svc");
setRequestHeader(“内容类型”、“文本/xml”);
对象setRequestHeader(“SOAPAction”http://MyServer:4444/GeoCode.svc"); 
setRequestHeader(“Content-Length”,soap.Length.ToString());
发送对象(soap);
字符串stat=obj.statusText;
字符串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(错误请求)状态。

我认为您的问题在于SOAPAction语句。你不想把它指向你的服务。相反,它应该是WSDL调用的端点

如果您感到有冒险精神,端点通常是WSDL中最后的条目之一。我记不起他们使用的具体术语,但应该是显而易见的


嗯,吉姆

我想我明白你的意思了。WSDL中有一个“soapAction”,如下所示:
http://tempuri.org/IGeoCode/GetLocation
我尝试了使用引号和不使用引号的字符串(我看到的SOAPAction示例的值都用引号括起来)。Pete,我认为在WSDL中,它是您想要的服务名称值。在本摘录中,您将有一个“CWSDataServicesBilling”的SOAPAction嘿,我的第一个绿色支票!谢谢,皮特。很高兴这有帮助。