我正在尝试修改并在BeforeSendRequest
方法中将自定义标头添加到soap消息中,如下所示:
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
{
MessageHeader header = MessageHeader.CreateHeader("name", "http://myname", "Oscar");
request.Headers.Add(header);
return null;
}
此时一切正常,标题会添加到soap标题中,如下所示:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<ActivityId CorrelationId="51efbfdb-2187-45b9-81fc-6a38815d5bed" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">d1351a78-a53a-4d32-ad35-fca6d4262adf</ActivityId>
<name xmlns="http://myname">Oscar</name>
</s:Header>
问题是我想在标题中添加更大的内容,最终结果必须是这样的:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<ActivityId CorrelationId="51efbfdb-2187-45b9-81fc-6a38815d5bed" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">d1351a78-a53a-4d32-ad35-fca6d4262adf</ActivityId>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:Username xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">username</wsse:Username>
<wsse:Password xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</s:Header>
有没有办法实现这个目标?
PS。请大家:-)不批评我,我在以下情况:
添加此用户名和密码auth时,您需要超过https
,问题是我尝试通信的这个基于Java的Web服务位于http
下,我认为它不符合要求因为根据第3个链接“通过不安全的连接传递凭据被认为是不好的做法”但是他们解决了在配置文件中添加标题的问题(我做的事情没有成功)。
我也阅读了这些链接并尝试了它们。此外,当从链接1和链接2进行操作时,我在Visual Studio中遇到了一种异常,例如“预期https而不是http”这就是我尝试使用MessageInspectors
的原因BeforeSendRequest
方法。
答案 0 :(得分:1)
ClearUsernameBinding是解决方案
答案 1 :(得分:0)
CreateHeader的第3个参数是一个对象。默认情况下,使用DataContractSerializer序列化此对象,因此如果您创建一个对头结构建模的数据协定,您可以将实例作为第三个参数传递,它将创建您想要的头
答案 2 :(得分:0)
虽然我的服务是https,但我遇到了同样的问题。它应该是一个配置问题,你不需要手动处理它。
无论如何,您不必使用BeforeSendRequest来使用MessageInspectors。 您应该尝试更改配置生成的代码,添加一些安全配置。 然后,WCF将创建您需要的标头。然后在代码中添加凭据,你应该没问题。
我想生成的代理正在创建一个customBinding或basicHttpBinding。 basicHttpBinding虽然不支持WS-Security规范,但您应该将其更改为custom或wsHttpBinding。您可以使用并找到正确的配置以获得所需的结果。
我添加的是“示例配置语法”:
<customBinding>
<binding name="MessageServerBinding">
<security defaultAlgorithmSuite="Default" authenticationMode="UserNameOverTransport"
requireDerivedKeys="true" includeTimestamp="true" messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
<secureConversationBootstrap />
</security>
........
</binding>
</customBinding>
这是一个示例配置,例如您可能不需要包含时间戳,或者您可能需要一个Nonce,如果我记得正确需要一些更多的效果,但不是很多。
查看此讨论:WCF: Adding Nonce to UsernameToken
希望这有帮助。