2013-08-06 7 views
1

это немного утомительный вопрос .. Я построил WCF использовать WS-Security, который выглядит, как это в моем журнале:WCF - заголовок Soap ссылается на пространстве имен, в защитном элементе, дважды

<h:Security xmlns:h="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
       xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
    <UsernameToken> 
    <Username> 
     <!-- Removed--> 
    </Username> 
    <Password> 
     <!-- Removed--> 
    </Password> 
    </UsernameToken> 
</h:Security> 

Вопрос в том, почему я получаю одно и то же пространство имен, на которое ссылаются дважды ("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")? Я знаю, что на самом деле не имеет значения, если одно и то же пространство имен ссылается дважды, если элементы ссылаются на правильное пространство имен, но я действительно удивляюсь, почему он это делает.

Мой код:

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 
[System.ServiceModel.MessageContractAttribute(IsWrapped = false)] 
public partial class InventoryCountRequest 
{ 

    [System.ServiceModel.MessageHeaderAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")] 
    public Security Security; 

    //Other MessageHeader and MessageBody attributes 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")] 
public partial class Security 
{ 
    private UsernameToken usernameTokenField; 

    [System.Xml.Serialization.XmlElementAttribute(Order = 0)] 
    public UsernameToken UsernameToken 
    { 
     get{return this.usernameTokenField;} 
     set{this.usernameTokenField = value;} 
    } 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")] 
public partial class UsernameToken 
{ 
    private string usernameField; 
    private Password passwordField; 

    [System.Xml.Serialization.XmlElementAttribute(Order = 0)] 
    public string Username 
    { 
    get{return this.usernameField;} 
    set{this.usernameField = value;} 
    } 

    [System.Xml.Serialization.XmlElementAttribute(Order = 1)] 
    public Password Password 
    { 
    get{return this.passwordField;} 
    set{this.passwordField = value;} 
    } 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")] 
public partial class Password 
{ 
    private string typeField; 
    private string valueField; 

    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string Type 
    { 
    get{return this.typeField;} 
    set{this.typeField = value;} 
    } 

    [System.Xml.Serialization.XmlTextAttribute()] 
    public string Value 
    { 
    get{return this.valueField;} 
    set{this.valueField = value;} 
    } 
} 

Большое спасибо за чтение

+0

Я недавно использовал программу wcf и использовал webservice, но в своем приложении я создаю customclass и добавляю tokennamespace. – Antony

+0

может быть, это вам поможет. http://weblog.west-wind.com/posts/2012/Nov/24/WCF-WSSecurity-and-WSE-Nonce-Authentication – Antony

ответ

0

Может быть, это не так, как сообщение выглядит в сети. Возможно, просмотрщик журналов WCF добавляет его (вы можете видеть, что он сделал некоторые манипуляции, так как он удалил пароль). Используйте Fiddler, чтобы увидеть, как выглядит реальное сообщение.

Затем вы вручную (через контракт с данными) добавили заголовок безопасности. В общем, WCF может быть сконфигурирован для этого путем настройки привязки. Поэтому, возможно, WCF идентифицирует заголовок безопасности и всегда присоединяет к нему некоторое пространство имен.

Я бы не стал беспокоиться об этом.