मुझे तीसरी पार्टी से साबुन संदेश स्वीकार करते समय यह समस्या थी।
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wssu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>userName</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">password</wsse:Password>
<wsse:Nonce>nonce</wsse:Nonce>
<wssu:Created>2015-02-19T16:24:32Z</wssu:Created>
</wsse:UsernameToken>
</wsse:Security>
ठीक से deserialize मैं अपने DataContract में IXmlSerializable, लागू करने की जरूरत, जैसा कि नीचे करने के लिए::
यहाँ soapHeader मैं भेजा जा रहा था (UsernameToken भीतर नोट अलग नामस्थान) है
[DataContract(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", Name = "Security")]
public partial class SecurityHeaderType
{
[XmlElementAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
[DataMember]
public UsernameToken UsernameToken { get; set; }
}
public class UsernameToken : IXmlSerializable
{
public string Username { get; set; }
public string Password { get; set; }
public string Nonce { get; set; }
public string Created { get; set; }
public XmlSchema GetSchema()
{
throw new NotImplementedException();
}
public void ReadXml(XmlReader reader)
{
Dictionary<string, string> secDictionary;
string xml = reader.ReadOuterXml();
using (var s = GenerateStreamFromString(xml))
{
secDictionary =
XElement.Load(s).Elements()
.ToDictionary(e => e.Name.LocalName, e => e.Value);
}
Username = secDictionary["Username"];
Password = secDictionary["Password"];
Nonce = secDictionary["Nonce"];
Created = secDictionary["Created"];
}
मैं फिर नीचे अपने हेडर को deserialize करने में सक्षम था:
if (OperationContext.Current.IncomingMessageHeaders.FindHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd") != -1)
{
var securityHeader = OperationContext.Current.IncomingMessageHeaders.GetHeader<SecurityHeaderType>("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
}
हम डी का उपयोग नहीं करते हैं efault डब्ल्यूसीएफ serialization। सेवा एक्सएमएल सीरियलाइजेशन पर निर्भर करती है। मैंने पहले से ही XmlNamespaceDeclarations विशेषता का उपयोग करने का प्रयास किया है। लेकिन यह काम नहीं लग रहा है। –
IXmlSerializable इंटरफेस को लागू करके समस्या को ठीक किया गया। –
@WvanNoort क्या आप अपने काम पर विस्तार कर सकते हैं? मुझे इस समय एक ही समस्या है। – Declan