96 lines
3.7 KiB
C#
96 lines
3.7 KiB
C#
|
//-----------------------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
namespace System.ServiceModel
|
||
|
{
|
||
|
using System;
|
||
|
using System.Xml;
|
||
|
using System.Text;
|
||
|
using System.Globalization;
|
||
|
using System.Collections.ObjectModel;
|
||
|
using System.ServiceModel.Channels;
|
||
|
using System.Runtime.Serialization;
|
||
|
|
||
|
[Serializable]
|
||
|
internal class MustUnderstandSoapException : CommunicationException
|
||
|
{
|
||
|
// for serialization
|
||
|
public MustUnderstandSoapException() { }
|
||
|
protected MustUnderstandSoapException(SerializationInfo info, StreamingContext context) : base(info, context) { }
|
||
|
|
||
|
|
||
|
Collection<MessageHeaderInfo> notUnderstoodHeaders;
|
||
|
EnvelopeVersion envelopeVersion;
|
||
|
|
||
|
public MustUnderstandSoapException(Collection<MessageHeaderInfo> notUnderstoodHeaders, EnvelopeVersion envelopeVersion)
|
||
|
{
|
||
|
this.notUnderstoodHeaders = notUnderstoodHeaders;
|
||
|
this.envelopeVersion = envelopeVersion;
|
||
|
}
|
||
|
|
||
|
public Collection<MessageHeaderInfo> NotUnderstoodHeaders { get { return this.notUnderstoodHeaders; } }
|
||
|
public EnvelopeVersion EnvelopeVersion { get { return this.envelopeVersion; } }
|
||
|
|
||
|
internal Message ProvideFault(MessageVersion messageVersion)
|
||
|
{
|
||
|
string name = this.notUnderstoodHeaders[0].Name;
|
||
|
string ns = this.notUnderstoodHeaders[0].Namespace;
|
||
|
FaultCode code = new FaultCode(MessageStrings.MustUnderstandFault, this.envelopeVersion.Namespace);
|
||
|
FaultReason reason = new FaultReason(SR.GetString(SR.SFxHeaderNotUnderstood, name, ns), CultureInfo.CurrentCulture);
|
||
|
MessageFault fault = MessageFault.CreateFault(code, reason);
|
||
|
string faultAction = messageVersion.Addressing.DefaultFaultAction;
|
||
|
Message message = System.ServiceModel.Channels.Message.CreateMessage(messageVersion, fault, faultAction);
|
||
|
if (this.envelopeVersion == EnvelopeVersion.Soap12)
|
||
|
{
|
||
|
this.AddNotUnderstoodHeaders(message.Headers);
|
||
|
}
|
||
|
return message;
|
||
|
}
|
||
|
|
||
|
void AddNotUnderstoodHeaders(MessageHeaders headers)
|
||
|
{
|
||
|
for (int i = 0; i < notUnderstoodHeaders.Count; ++i)
|
||
|
{
|
||
|
headers.Add(new NotUnderstoodHeader(notUnderstoodHeaders[i].Name, notUnderstoodHeaders[i].Namespace));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class NotUnderstoodHeader : MessageHeader
|
||
|
{
|
||
|
string notUnderstoodName;
|
||
|
string notUnderstoodNs;
|
||
|
|
||
|
public NotUnderstoodHeader(string name, string ns)
|
||
|
{
|
||
|
this.notUnderstoodName = name;
|
||
|
this.notUnderstoodNs = ns;
|
||
|
}
|
||
|
|
||
|
public override string Name
|
||
|
{
|
||
|
get { return Message12Strings.NotUnderstood; }
|
||
|
}
|
||
|
|
||
|
public override string Namespace
|
||
|
{
|
||
|
get { return Message12Strings.Namespace; }
|
||
|
}
|
||
|
|
||
|
protected override void OnWriteStartHeader(XmlDictionaryWriter writer, MessageVersion messageVersion)
|
||
|
{
|
||
|
writer.WriteStartElement(this.Name, this.Namespace);
|
||
|
writer.WriteXmlnsAttribute(null, notUnderstoodNs);
|
||
|
writer.WriteStartAttribute(Message12Strings.QName);
|
||
|
writer.WriteQualifiedName(notUnderstoodName, notUnderstoodNs);
|
||
|
writer.WriteEndAttribute();
|
||
|
}
|
||
|
|
||
|
protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
|
||
|
{
|
||
|
// empty
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|