我需要为SOAP请求创建一个标头。搜索之后,我成功地用XML生成了头请求,但我需要在XML标记上加上前缀。
实际上,我已经产生了这个:
<TimeStamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TimeStamp-2">
<Created>2016-03-22T10:10:55.710Z</Created>
<Expires>2016-03-22T11:10:55.710Z</Expires>
</TimeStamp>我需要这样做:
<wsu:TimeStamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TimeStamp-2">
<Created>2016-03-22T10:10:55.710Z</Created>
<Expires>2016-03-22T11:10:55.710Z</Expires>
</wsu:TimeStamp>这个主题(How can I pass a username/password in the header to a SOAP WCF Service)启发了我创建类和生成XML。
这是我的版本:
class SecurityHeader : MessageHeader
{
public override string Name
{
get { return "Security"; }
}
public override string Namespace
{
get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; }
}
protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
XmlSerializer serializer1 = new XmlSerializer(typeof(TimeStamp));
serializer1.Serialize(Console.Out, new TimeStamp(), ns);
}
}
[XmlRoot("TimeStamp",Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
public class TimeStamp
{
public TimeStamp()
{
Id = "TimeStamp-2";
Created = new Created() { Value = Created.GenerateTimeStampCreation() };
Expires = new Expires() { Value = Expires.GenerateTimeStampExpiration() };
}
[XmlAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")]
public string Id { get; set; }
[XmlElement]
public Created Created { get; set; }
[XmlElement]
public Expires Expires { get; set; }
}发布于 2016-03-22 18:41:21
你在这里有几个问题:
<Created>和<Expires>元素不在"wsu"命名空间中,而是不在任何名称空间中。您需要通过设置XmlSerializer或[XmlElement(Namespace="")]通知[XmlElement(Form = XmlSchemaForm.Unqualified)]或[XmlElement(Namespace="")]。Id属性具有显式命名空间,需要设置[XmlAttribute(Form = XmlSchemaForm.Qualified)]。xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",但有时需要"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"。为了避免这种错误,您可以创建一个包含正确命名空间的public const string,而不是多次重新键入字符串。因此,固定的TimeStamp类如下所示:
[XmlRoot("TimeStamp", Namespace = TimeStamp.WsuNamespace)]
public class TimeStamp
{
public const string WsuNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
public TimeStamp()
{
Id = "TimeStamp-2";
Created = new Created() { Value = Created.GenerateTimeStampCreation() };
Expires = new Expires() { Value = Expires.GenerateTimeStampExpiration() };
}
[XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified)] // Indicates this attribute is explicitly in the same namespace as the parent class
public string Id { get; set; }
[XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] // Indicates this element is not in any namespace
public Created Created { get; set; }
[XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] // Indicates this element is not in any namespace
public Expires Expires { get; set; }
}在您的写作方法中,请执行:
protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
{
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("wsu", TimeStamp.WsuNamespace);
XmlSerializer serializer1 = new XmlSerializer(typeof(TimeStamp));
serializer1.Serialize(writer, new TimeStamp(), ns);
}https://stackoverflow.com/questions/36155620
复制相似问题