我一直试图从.NET客户端调用第三方Web服务。我必须为每个请求设置一些自定义标头,以便遵守其身份验证要求。
我使用了this answer,以便我将请求标头值显示为:
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="0">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-2">
<wsse:Username>Jimbob</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">P@ssword</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</s:Header>
<s:Body>
...
</s:Body>
</s:Envelope>
(我这样做是通过在配置中设置自定义<endpoint><headers /></endpoint>
部分)
我已经通过Fiddler检查了请求,并且它正在发送正确的标头值,并且web服务正在返回预期的结果。
但是,客户端在收到结果时抛出以下异常:
System.ServiceModel.ProtocolException:标题&#39;安全&#39;来自命名空间&#39; http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&#39;此邮件的收件人不理解该邮件,导致邮件无法处理。此错误通常表示此消息的发送方已启用接收方无法处理的通信协议。请确保客户端绑定的配置与服务的绑定一致。
repsonse的相关部分(来自Fiddler)是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soap:mustUnderstand="1">
<wsse:UsernameToken wsu:Id="UsernameToken-371676">
<wsse:Username>SOMEUSERTOKEN</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">SOMEUSERTOKEN</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
<soap:Body>
...
<soap:Body>
</soap:Envelope>
基本上我现在输了。我推测我需要执行某种消息检查来标记该标题,但是为了解释结果(我已经从中得到)它似乎确实很重要网络服务)。
非常感谢任何帮助。
答案 0 :(得分:0)
如果您只是想进行身份验证,我确实使用了以下代码用于我的c#控制台应用程序,并且它运行正常。我在配置文件中使用了此代码,但在<system.serviceModel>
- &gt; <client>
- &gt;下<endpoint>
<headers>
<wsse:Security mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" >
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>SOMEUSERTOKEN</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">SOMEUSERTOKEN</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</headers>