【问题标题】:Direct POST to WCF WSDL-first web service直接 POST 到 WCF WSDL 优先的 Web 服务
【发布时间】:2011-06-02 14:25:42
【问题描述】:

我需要一些帮助将一些 XML 发布到 WCF 服务。从本质上讲,我遇到的问题是“400:错误请求”的 HTTP 响应 - 听起来很具有描述性,但我正在努力寻找任何答案!

首先,我在 WCF 中构建的服务基于现有的 WSDL,最初来自 IBM WebSphere Web 服务。经过一些操作(删除 MIME 附件,下载一些远程模式)后,我设法让 svcutil 生成一个服务接口,从所有意图和目的来看,它似乎都是有效的。

我已经在我的 WCF 服务中实现了该接口,并且在运行 WCF 测试客户端时,我可以附加到该服务,提交请求并接收响应没有问题。到目前为止一切顺利!

当移动到通过 HttpWebRequest 类将 XML 发布到 Web 服务的测试应用程序时,我开始收到“400:错误请求”响应,即使我使用的是 WCF 测试客户端提供的 XML。

我使用 WCF 跟踪来转储它正在接收的消息,并且有一个显着的区别 - 所有 WCF 测试客户端消息都正确填充并显示它们的标头信息等,所有这些都来自我的 SOAP 测试实用程序显示为“格式错误”。查看消息选项卡,我发送的手动 POST 消息的正文包含在一个元素中:

<MessageLogTraceRecord><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:57567/Service1.svc</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.nowhere.co.uk/RequestService/RequestOperation</Action>
</s:Header>
</s:Envelope>
]]></MessageLogTraceRecord>

而 WCF 消息显示为:

<MessageLogTraceRecord>
<HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<Method>POST</Method>
<QueryString></QueryString>
<WebHeaders>
<Connection>Keep-Alive</Connection>
<Content-Length>185</Content-Length>
<Content-Type>text/xml; charset=utf-8</Content-Type>
<Accept-Encoding>gzip, deflate</Accept-Encoding>
<Expect>100-continue</Expect>
<Host>localhost:57567</Host>
<VsDebuggerCausalityData>uIDPo4VLDcJD5AZDjB5sdmoeakEAAAAAH/hWABuWQ0iiq47QDHh0GlelCLcEx7FLibxRvpq1tTgACQAA</VsDebuggerCausalityData>
<SOAPAction>"http://www.nowhere.co.uk/RequestService/RequestOperation"</SOAPAction>
</WebHeaders>
</HttpRequest>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:57567/Service1.svc</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.nowhere.co.uk/RequestService/RequestOperation</Action>
</s:Header>
</s:Envelope>
</MessageLogTraceRecord>

我尝试在 Fiddler 中进行跟踪无济于事 - 尽管修改了它的 app.config 文件,但我无法让 WCF 测试客户端通过它创建的代理提交请求。我已经跟踪了我的 SOAP 请求,但是可以看到以下内容:

Content-Type: text/xml; charset="utf-8"
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:57567
SOAPAction: "http://www.nowhere.co.uk/RequestService/RequestOperation"
Content-Length: 459
Expect: 100-continue
Connection: Keep-Alive

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:57567/Service1.svc</To>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.nowhere.co.uk/RequestService/RequestOperation</Action>
</s:Header>
</s:Envelope>

据我所知,我发送的消息应该没问题 - 除了标题和消息内容之外,我看不到还能发送什么。

最后我要说的是,我绝不是 WCF 专家,由于商业敏感性,我不得不更改特定的 SOAPAction 值..

任何人都可以为这个相当令人沮丧的问题提供任何帮助吗?

提前致谢

【问题讨论】:

  • fiddler 在 localhost 上无法正常工作,请尝试在一台机器上运行该服务并在另一台机器上运行 wcftestclient。这通常有效。至于找出问题所在,请尝试在服务器端启用跟踪,跟踪应该有一个异常,准确地告诉您出了什么问题。

标签: wcf web-services post httpwebrequest http-status-code-400


【解决方案1】:

感谢 Fiddler 的评论 - 我设法跟踪了 WCF 请求,并且使用请求中的 xml 似乎有效!从那以后,我尝试了一条完整的消息,该消息对 WCF 客户端的 WebSphere 服务有效,并且也有效!

认为问题出在 Action 标头上。我相信 WCF 只支持 WSA 的几个修订版,没有一个是这个特定 WSDL 正在使用的版本。查看失败的原始请求(从 WCF 测试客户端前端拉出),它使用的寻址命名空间被声明为:

xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none"

而到达服务的实际 WCF 请求声明为:

xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing"

实际元素本身填充了相同的值,只是命名空间不同:

<wsa:Action>http://www.nowhere.co.uk/RequestService/RequestOperation</wsa:Action>

因此,使用正确的寻址版本并省略较新的 WCF 兼容版本似乎已经解决了问题!

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多