【发布时间】:2019-06-23 06:52:39
【问题描述】:
我正在尝试使用 Visual Studio 中的“添加 serviceReference”功能调用 SOAP。 SOAP 身份验证方法应该使用 OASIS 来完成。标题应该类似于
<Security xmlns="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" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username></wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">monMonDePasse</wsse:Password>
<wsse:Nonce>sdsdsdlojhfdsdM5Nw==</wsse:Nonce>
<wsu:Created>2019-01-21T6:17:34Z</wsu:Created>
</wsse:UsernameToken>
</Security>
所有类均成功生成,无需手动添加 UsernameToken 和 Security 类。
var UsernameToken = new UsernameToken{ Username = userName, Password = password, Nonce = nonce, Created = created };
我正在使用以下代码在标题中添加安全性:
Security security = new Security { UsernameToken =UsernameToken };
System.ServiceModel.Channels.MessageHeader messageHeader =
System.ServiceModel.Channels.MessageHeader.CreateHeader(name: "Security",
ns: "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-
secext-1.0.xsd", value: security, mustUnderstand: true);
我的问题是手动创建的对象的输出名称空间不正确。这是生成的请求
<UsernameToken
xmlns="http://schemas.datacontract.org/2004/07/ProjectName.UnitTesting"> //This is not the correct namespace
<Created>2019-01-21T06:42:15Z</Created>
<Nonce>NzUyZg==</Nonce>
<Password>MonUserName=</Password>
<Username>MonPassword</Username>
我想将 usernameToken 命名空间设置为
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
而不是
"http://schemas.datacontract.org/2004/07/ProjectName.UnitTesting"
我尝试添加属性
[XmlAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
仍然面临同样的问题。我也面临与 serviceContract 属性相同的问题。 谢谢,
【问题讨论】:
-
MessageHeader 类有一个属性命名空间,它是一个字符串。尝试设置它,看看会发生什么。