用于调用WCF web服务的确切HTTP内容是什么?
本文关键字:HTTP 是什么 WCF 调用 web 服务 用于 | 更新日期: 2023-09-27 18:02:06
我有一个WCF服务,它是使用Visual Studio 2013 New Project向导创建的。我可以使用WCF测试客户端调用该服务,它工作得很好。但是,我想使用curl从命令行调用服务。
我所做的是从WCF测试客户端复制了请求内容,看起来像:<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/IService1/TestStr</Action>
</s:Header>
<s:Body>
<TestStr xmlns="http://tempuri.org/" />
</s:Body>
</s:Envelope>
并将其保存在名为Test.txt
的文件中。然后,从命令行执行:
curl --verbose --header "Content-Type:text/xml; charset=utf-8" -X POST -d @Test.txt http://localhost:64777/Service1.svc
我得到的结果是:
* Adding handle: conn: 0x50e5a0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x50e5a0) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 64777 (#0)
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 64777 (#0)
> POST /Service1.svc HTTP/1.1
> User-Agent: curl/7.33.0
> Host: localhost:64777
> Accept: */*
> Content-Type:text/xml; charset=utf-8
> Content-Length: 343
>
* upload completely sent off: 343 out of 343 bytes
< HTTP/1.1 400 Bad Request
< Cache-Control: private
* Server Microsoft-IIS/8.0 is not blacklisted
< Server: Microsoft-IIS/8.0
< X-AspNet-Version: 4.0.30319
< X-SourceFiles: =?UTF-8?B?YzpcdXNlcnNcbWNocmlzdGVuc2VuXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTNcUHJvamVjdHNcV2NmR2VuZXJpY3NcV2NmR2VuZXJpY3NcU2VydmljZTEuc3Zj?=
< X-Powered-By: ASP.NET
< Date: Tue, 06 May 2014 18:47:29 GMT
< Content-Length: 0
<
* Connection #0 to host localhost left intact
WCF测试客户端调用web服务的方式和Curl调用web服务的方式有什么不同?我的URL写错了吗?我错过了一些HTTP头吗?谢谢!
更新:
我也试过URL http://localhost:64777/Service1.svc/TestStr
。我也尝试过编码文件:
%3Cs%3AEnvelope%20xmlns%3As%3D%22http%3A%2F%2Fschemas.xmlsoap.org%2Fsoap%2Fenvelope%2F%22%3E%0A%20%20%3Cs%3AHeader%3E%0A%20%20%20%20%3CAction%20s%3AmustUnderstand%3D%221%22%20xmlns%3D%22http%3A%2F%2Fschemas.microsoft.com%2Fws%2F2005%2F05%2Faddressing%2Fnone%22%3Ehttp%3A%2F%2Ftempuri.org%2FIService1%2FTestStr%3C%2FAction%3E%0A%20%20%3C%2Fs%3AHeader%3E%0A%20%20%3Cs%3ABody%3E%0A%20%20%20%20%3CTestStr%20xmlns%3D%22http%3A%2F%2Ftempuri.org%2F%22%20%2F%3E%0A%20%20%3C%2Fs%3ABody%3E%0A%3C%2Fs%3AEnvelope%3E
都只会导致Bad Request
您可以使用Fiddler捕获确切的HTTP请求。不幸的是,WCF跟踪不能捕获通过网络发送的确切字节。它报告发送的实际XML的修改副本。Fiddler不知道web服务,所以它不做这些
看起来您创建了一个SOAP web服务,但是我没有看到您的请求数据示例中包含任何SOAP标头。在您的web服务代码中-添加一行来捕获服务通过OperationContext对象接收到的实际请求:OperationContext.Current.RequestContext.RequestMessage.ToString()
您应该能够从RequestMessage
属性捕获数据,将其保存到文件中,然后使用CURL提交。
(您可能不得不剥离<Action>
元素,因为我认为这些是由WCF添加的,如果您试图提交包含它们的请求,可能会导致问题)