【问题标题】:Duplicate security elements when building custom soap request构建自定义肥皂请求时重复的安全元素
【发布时间】:2012-08-15 23:35:58
【问题描述】:

我正在尝试向 WCF 服务发送一个肥皂请求。我正在使用 System.ServiceModel.Channels.Message.CreateMessage() 方法构建肥皂请求。

我还没有深入了解如何构建身体,但这就是我所拥有的......

Message msg = Message.CreateMessage( MessageVersion.Soap11WSAddressing10, "MethodName" );
msg.Headers.MessageId = new UniqueId( Guid.NewGuid().ToString() );
msg.Headers.Add( Message.CreateHeader( "Security", "",
    new Security()
    {
        TimeStamp = new TimeStampType() {
            Created = DateTime.Now,
            Expires = Created.AddDays( 1 )
        },
        UsernameToken = new UsernameToken() {
            Username = "stackoverflow",
            Password = new Password() {
                Type = "hashed",
                Value = "Password"
            }
        }
     }, new SecuritySerializer() ) ) ); // The serializer inherits XmlObjectSerializer. Internally it is using the XmlSerializer class.

string s = msg.ToString();

当我运行它时,我得到以下输出。顺便说一句,我正在使用 Visual Studio XML Visualizer。

<s:Envelope>
    <s:Header>
        <Action>MethodName</Action>
        <MessageID>GUIDVALUE</MessageID>
        <Security>
            <Security>
               .....
            </Security>
        </Security>
    </s:Header>
    <s:Body />
</s:Envelope>

我的问题是,我怎样才能删除安全元素之一?我应该有一个,但我有两个,因为我第一次将元素名称传递给 Message.CreateHeader() 方法,第二个是从序列化程序生成的。

提前致谢

【问题讨论】:

    标签: c# wcf serialization soap xml-serialization


    【解决方案1】:

    我通过使 Security 类继承自 MessageHeader 抽象类来解决此问题。然后我重写了 OnWriteHeaderContents 方法并在那里序列化了属性。我还取出了 MessageHeader.CreateHeader(),因为 Security 对象现在是一个标头对象。

    【讨论】:

    • 如果你需要一个命名空间前缀,你需要重写 OnWriteStartHeader 方法并执行类似 writer.WriteStartElement( "prefix", this.Name, this.Namespace )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多