public WsFaultException(WsWsaHeader header, WsFaultType faultType, String message, String detail)
 {
     this.Header    = header;
     this.FaultType = faultType;
     _message       = message;
     _detail        = detail;
 }
Beispiel #2
0
 public WsFaultException(WsWsaHeader header, WsFaultType faultType, String message, String detail)
 {
     this.Header = header;
     this.FaultType = faultType;
     _message = message;
     _detail = detail;
 }
Beispiel #3
0
 public WsFaultException(WsWsaHeader header, WsFaultType faultType)
     : this(header, faultType, null)
 {
 }
Beispiel #4
0
        internal static WsMessage GenerateFaultResponse(WsWsaHeader header, WsFaultType faultType, String details)
        {
            String code = String.Empty;
            String subcode = String.Empty;
            String reason = String.Empty;

            switch (faultType)
            {
                case WsFaultType.ArgumentException:
                    code = "soap:Receiver";
                    subcode = "Ws:ArgumentException";
                    reason = "One of the arguments provided to a method is not valid.";
                    break;
                case WsFaultType.ArgumentNullException:
                    code = "soap:Receiver";
                    subcode = "Ws:ArgumentNullException";
                    reason = "A null reference was passed to a method that does not accept it as a valid argument.";
                    break;
                case WsFaultType.Exception:
                    code = "soap:Receiver";
                    subcode = "Ws:Exception";
                    reason = "Errors occured during application execution.";
                    break;
                case WsFaultType.InvalidOperationException:
                    code = "soap:Receiver";
                    subcode = "Ws:InvalidOperationException";
                    reason = "A method call is invalid for the object's current state.";
                    break;
                case WsFaultType.XmlException:
                    code = "soap:Receiver";
                    subcode = "Ws:XmlException";
                    reason = "Syntax errors found during parsing.";
                    break;

                case WsFaultType.WsaInvalidMessageInformationHeader:
                    code = "soap:Sender";
                    subcode = "wsa:InvalidMessageInformationHeader";
                    reason = "A message information header is not valid and cannot be processed.";
                    break;
                case WsFaultType.WsaMessageInformationHeaderRequired:
                    code = "soap:Sender";
                    subcode = "wsa:MessageInformationHeaderRequired";
                    reason = "A required message Information header, To, MessageID, or Action, is not present";
                    break;
                case WsFaultType.WsaDestinationUnreachable:
                    code = "soap:Sender";
                    subcode = "wsa:DestinationUnreachable";
                    reason = "No route can be determined to reach the destination role defined by the WS=Addressing To.";
                    break;
                case WsFaultType.WsaActionNotSupported:
                    code = "soap:Sender";
                    subcode = "wsa:ActionNotSupported";
                    reason = "The [action] cannot be processed at the receiver.";
                    break;
                case WsFaultType.WsaEndpointUnavailable:
                    code = "soap:Receiver";
                    subcode = "wsa:EndpointUnavailable";
                    reason = "The endpoint is unable to process the message at this time.";
                    break;

                case WsFaultType.WseDeliverModeRequestedUnavailable:
                    code = "soap:Sender";
                    subcode = "wse:DeliverModeRequestedUnavailable";
                    reason = "The request delivery mode is not supported.";
                    break;
                case WsFaultType.WseInvalidExpirationTime:
                    code = "soap:Sender";
                    subcode = "wse:InvalidExpirationTime";
                    reason = "The expiration time requested is invalid.";
                    break;
                case WsFaultType.WseUnsupportedExpirationType:
                    code = "soap:Sender";
                    subcode = "wse:UnsupportedExpirationType";
                    reason = "Only expiration durations are supported.";
                    break;
                case WsFaultType.WseFilteringNotSupported:
                    code = "soap:Sender";
                    subcode = "wse:FilteringNotSupported";
                    reason = "Filtering is not supported.";
                    break;
                case WsFaultType.WseFilteringRequestedUnavailable:
                    code = "soap:Sender";
                    subcode = "wse:FilteringRequestedUnavailable";
                    reason = "The requested filter dialect is not supported.";
                    break;
                case WsFaultType.WseEventSourceUnableToProcess:
                    code = "soap:Receiver";
                    subcode = "wse:EventSourceUnableToProcess";
                    reason = "No explaination yet.";
                    break;
                case WsFaultType.WseUnableToRenew:
                    code = "soap:Receiver";
                    subcode = "wse:UnableToRenew";
                    reason = "No explaination yet.";
                    break;
                case WsFaultType.WseInvalidMessage:
                    code = "soap:Sender";
                    subcode = "wse:InvalidMessage";
                    reason = "Message is not valid and cannot be processed.";
                    break;
            }

            // Create the XmlWriter
            MemoryStream soapStream = new MemoryStream();
            XmlWriter xmlWriter = XmlWriter.Create(soapStream);

            // Generate the fault Header
            WsWsaHeader faultHeader = new WsWsaHeader(
                WsWellKnownUri.WsaNamespaceUri_2005_08 + "/fault", // Action
                header.MessageID,                          // RelatesTo
                "urn:schemas-xmlsoap-org:ws:2005:08:fault",// To
                null, null, null);                           // ReplyTo, From, Any

            WsSoapMessageWriter.WriteSoapMessageStart(xmlWriter, WsSoapMessageWriter.Prefixes.Wsdp, null, faultHeader, null);

            // Generate fault Body
            xmlWriter.WriteStartElement("wsa", "Fault", null);

            xmlWriter.WriteStartElement("wsa", "Code", null);
            xmlWriter.WriteStartElement("wsa", "Value", null);
            xmlWriter.WriteString(code);
            xmlWriter.WriteEndElement(); // End Value
            xmlWriter.WriteStartElement("wsa", "Subcode", null);
            xmlWriter.WriteStartElement("wsa", "Value", null);
            xmlWriter.WriteString(subcode);
            xmlWriter.WriteEndElement(); // End Value
            xmlWriter.WriteEndElement(); // End Subcode
            xmlWriter.WriteEndElement(); // End Code

            xmlWriter.WriteStartElement("wsa", "Reason", null);
            xmlWriter.WriteStartElement("wsa", "Text", null);
            xmlWriter.WriteAttributeString("xml", "lang", null, "en");
            xmlWriter.WriteString(reason);
            xmlWriter.WriteEndElement(); // End Text
            xmlWriter.WriteEndElement(); // End Reason

            xmlWriter.WriteStartElement("wsdp", "Detail", null);
            xmlWriter.WriteString(details);
            xmlWriter.WriteEndElement(); // End Detail

            xmlWriter.WriteEndElement(); // End Fault

            WsSoapMessageWriter.WriteSoapMessageEnd(xmlWriter);

            // Flush and close writer. Return stream buffer
            xmlWriter.Flush();
            xmlWriter.Close();

            WsMessage response = new WsMessage(soapStream.ToArray());
            return response;
        }
Beispiel #5
0
 public WsFaultException(WsWsaHeader header, WsFaultType faultType, String message)
     : this(header, faultType, message, null)
 {
 }
Beispiel #6
0
        internal static WsMessage GenerateFaultResponse(WsWsaHeader header, WsFaultType faultType, String details, ProtocolVersion version)
        {
            String code = String.Empty;
            String subcode = String.Empty;
            String reason = String.Empty;
            WsPrefix extraNS = WsPrefix.Wse;

            string faultAddress = null;

            if(header.FaultTo != null)
            {
                faultAddress = header.FaultTo.Address.OriginalString;
            }

            if (faultAddress == null)
            {
                faultAddress = version.AnonymousUri;
            }

            switch (faultType)
            {
                case WsFaultType.ArgumentException:
                    code =  WsNamespacePrefix.Soap + ":Receiver";
                    subcode = "ArgumentException";
                    reason = "One of the arguments provided to a method is not valid.";
                    break;
                case WsFaultType.ArgumentNullException:
                    code = WsNamespacePrefix.Soap + ":Receiver";
                    subcode = "ArgumentNullException";
                    reason = "A null reference was passed to a method that does not accept it as a valid argument.";
                    break;
                case WsFaultType.Exception:
                    code = WsNamespacePrefix.Soap + ":Receiver";
                    subcode = "Exception";
                    reason = "Errors occured during application execution.";
                    break;
                case WsFaultType.InvalidOperationException:
                    code = WsNamespacePrefix.Soap + ":Receiver";
                    subcode = "InvalidOperationException";
                    reason = "A method call is invalid for the object's current state.";
                    break;
                case WsFaultType.XmlException:
                    code = WsNamespacePrefix.Soap + ":Receiver";
                    subcode = "XmlException";
                    reason = "Syntax errors found during parsing.";
                    break;

                case WsFaultType.WsaInvalidMessageInformationHeader:
                    code = WsNamespacePrefix.Soap + ":Sender";
                    subcode = WsNamespacePrefix.Wsa + ":InvalidMessageInformationHeader";
                    reason = "A message information header is not valid and cannot be processed.";
                    break;
                case WsFaultType.WsaMessageInformationHeaderRequired:
                    code = WsNamespacePrefix.Soap + ":Sender";
                    subcode = WsNamespacePrefix.Wsa + ":MessageInformationHeaderRequired";
                    reason = "A required message Information header, To, MessageID, or Action, is not present";
                    break;
                case WsFaultType.WsaDestinationUnreachable:
                    code = WsNamespacePrefix.Soap + ":Sender";
                    subcode = WsNamespacePrefix.Wsa + ":DestinationUnreachable";
                    reason = "No route can be determined to reach the destination role defined by the WS=Addressing To.";
                    break;
                case WsFaultType.WsaActionNotSupported:
                    code = WsNamespacePrefix.Soap + ":Sender";
                    subcode = WsNamespacePrefix.Wsa + ":ActionNotSupported";
                    reason = "The [action] cannot be processed at the receiver.";
                    break;
                case WsFaultType.WsaEndpointUnavailable:
                    code = WsNamespacePrefix.Soap + ":Receiver";
                    subcode = WsNamespacePrefix.Wsa + ":EndpointUnavailable";
                    reason = "The endpoint is unable to process the message at this time.";
                    break;

                case WsFaultType.WseDeliverModeRequestedUnavailable:
                    code = WsNamespacePrefix.Soap + ":Sender";
                    subcode = WsNamespacePrefix.Wse + ":DeliverModeRequestedUnavailable";
                    reason = "The request delivery mode is not supported.";
                    extraNS = WsPrefix.Wse;
                    break;
                case WsFaultType.WseInvalidExpirationTime:
                    code = WsNamespacePrefix.Soap + ":Sender";
                    subcode = WsNamespacePrefix.Wse + ":InvalidExpirationTime";
                    reason = "The expiration time requested is invalid.";
                    extraNS = WsPrefix.Wse;
                    break;
                case WsFaultType.WseUnsupportedExpirationType:
                    code = WsNamespacePrefix.Soap + ":Sender";
                    subcode = WsNamespacePrefix.Wse + ":UnsupportedExpirationType";
                    reason = "Only expiration durations are supported.";
                    extraNS = WsPrefix.Wse;
                    break;
                case WsFaultType.WseFilteringNotSupported:
                    code = WsNamespacePrefix.Soap + ":Sender";
                    subcode = WsNamespacePrefix.Wse + ":FilteringNotSupported";
                    reason = "Filtering is not supported.";
                    extraNS = WsPrefix.Wse;
                    break;
                case WsFaultType.WseFilteringRequestedUnavailable:
                    code = WsNamespacePrefix.Soap + ":Sender";
                    subcode = WsNamespacePrefix.Wse + ":FilteringRequestedUnavailable";
                    reason = "The requested filter dialect is not supported.";
                    extraNS = WsPrefix.Wse;
                    break;
                case WsFaultType.WseEventSourceUnableToProcess:
                    code = WsNamespacePrefix.Soap + ":Receiver";
                    subcode = WsNamespacePrefix.Wse + ":EventSourceUnableToProcess";
                    reason = "No explaination yet.";
                    extraNS = WsPrefix.Wse;
                    break;
                case WsFaultType.WseUnableToRenew:
                    code = WsNamespacePrefix.Soap + ":Receiver";
                    subcode = WsNamespacePrefix.Wse + ":UnableToRenew";
                    reason = "No explaination yet.";
                    extraNS = WsPrefix.Wse;
                    break;
                case WsFaultType.WseInvalidMessage:
                    code = WsNamespacePrefix.Soap + ":Sender";
                    subcode = WsNamespacePrefix.Wse + ":InvalidMessage";
                    reason = "Message is not valid and cannot be processed.";
                    extraNS = WsPrefix.Wse;
                    break;
            }

            // Create the XmlWriter
            using(XmlMemoryWriter xmlWriter = XmlMemoryWriter.Create())
            {
                // Generate the fault Header
                WsWsaHeader faultHeader = new WsWsaHeader(
                    version.AddressingNamespace + "/fault", // Action
                    header.MessageID,                       // RelatesTo
                    faultAddress,                           // To
                    null, null, null);                      // ReplyTo, From, Any

                faultHeader.IsFaultMessage = true;

                WsMessage msg = new WsMessage(faultHeader, null, extraNS, null, null);

                WsSoapMessageWriter smw = new WsSoapMessageWriter(version);
                smw.WriteSoapMessageStart(xmlWriter, msg);

                // Generate fault Body
                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Fault", null);

                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Code", null);
                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Value", null);
                xmlWriter.WriteString(code);
                xmlWriter.WriteEndElement(); // End Value
                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Subcode", null);
                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Value", null);
                xmlWriter.WriteString(subcode);
                xmlWriter.WriteEndElement(); // End Value
                xmlWriter.WriteEndElement(); // End Subcode
                xmlWriter.WriteEndElement(); // End Code

                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Reason", null);
                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Text", null);
                xmlWriter.WriteAttributeString("xml", "lang", "http://www.w3.org/XML/1998/namespace", "en-US");
                xmlWriter.WriteString(reason);
                xmlWriter.WriteEndElement(); // End Text
                xmlWriter.WriteEndElement(); // End Reason

                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap , "Detail", null);
                xmlWriter.WriteString(details);
                xmlWriter.WriteEndElement(); // End Detail

                xmlWriter.WriteEndElement(); // End Fault

                smw.WriteSoapMessageEnd(xmlWriter);

                msg.Body = xmlWriter.ToArray();

                // Flush and close writer. Return stream buffer
                return msg;
            }
        }
Beispiel #7
0
 public WsFaultException(WsWsaHeader header, WsFaultType faultType)
     : this(header, faultType, null)
 {
 }
Beispiel #8
0
        internal static WsMessage GenerateFaultResponse(WsWsaHeader header, WsFaultType faultType, String details)
        {
            String code    = String.Empty;
            String subcode = String.Empty;
            String reason  = String.Empty;

            switch (faultType)
            {
            case WsFaultType.ArgumentException:
                code    = "soap:Receiver";
                subcode = "Ws:ArgumentException";
                reason  = "One of the arguments provided to a method is not valid.";
                break;

            case WsFaultType.ArgumentNullException:
                code    = "soap:Receiver";
                subcode = "Ws:ArgumentNullException";
                reason  = "A null reference was passed to a method that does not accept it as a valid argument.";
                break;

            case WsFaultType.Exception:
                code    = "soap:Receiver";
                subcode = "Ws:Exception";
                reason  = "Errors occured during application execution.";
                break;

            case WsFaultType.InvalidOperationException:
                code    = "soap:Receiver";
                subcode = "Ws:InvalidOperationException";
                reason  = "A method call is invalid for the object's current state.";
                break;

            case WsFaultType.XmlException:
                code    = "soap:Receiver";
                subcode = "Ws:XmlException";
                reason  = "Syntax errors found during parsing.";
                break;

            case WsFaultType.WsaInvalidMessageInformationHeader:
                code    = "soap:Sender";
                subcode = "wsa:InvalidMessageInformationHeader";
                reason  = "A message information header is not valid and cannot be processed.";
                break;

            case WsFaultType.WsaMessageInformationHeaderRequired:
                code    = "soap:Sender";
                subcode = "wsa:MessageInformationHeaderRequired";
                reason  = "A required message Information header, To, MessageID, or Action, is not present";
                break;

            case WsFaultType.WsaDestinationUnreachable:
                code    = "soap:Sender";
                subcode = "wsa:DestinationUnreachable";
                reason  = "No route can be determined to reach the destination role defined by the WS=Addressing To.";
                break;

            case WsFaultType.WsaActionNotSupported:
                code    = "soap:Sender";
                subcode = "wsa:ActionNotSupported";
                reason  = "The [action] cannot be processed at the receiver.";
                break;

            case WsFaultType.WsaEndpointUnavailable:
                code    = "soap:Receiver";
                subcode = "wsa:EndpointUnavailable";
                reason  = "The endpoint is unable to process the message at this time.";
                break;

            case WsFaultType.WseDeliverModeRequestedUnavailable:
                code    = "soap:Sender";
                subcode = "wse:DeliverModeRequestedUnavailable";
                reason  = "The request delivery mode is not supported.";
                break;

            case WsFaultType.WseInvalidExpirationTime:
                code    = "soap:Sender";
                subcode = "wse:InvalidExpirationTime";
                reason  = "The expiration time requested is invalid.";
                break;

            case WsFaultType.WseUnsupportedExpirationType:
                code    = "soap:Sender";
                subcode = "wse:UnsupportedExpirationType";
                reason  = "Only expiration durations are supported.";
                break;

            case WsFaultType.WseFilteringNotSupported:
                code    = "soap:Sender";
                subcode = "wse:FilteringNotSupported";
                reason  = "Filtering is not supported.";
                break;

            case WsFaultType.WseFilteringRequestedUnavailable:
                code    = "soap:Sender";
                subcode = "wse:FilteringRequestedUnavailable";
                reason  = "The requested filter dialect is not supported.";
                break;

            case WsFaultType.WseEventSourceUnableToProcess:
                code    = "soap:Receiver";
                subcode = "wse:EventSourceUnableToProcess";
                reason  = "No explaination yet.";
                break;

            case WsFaultType.WseUnableToRenew:
                code    = "soap:Receiver";
                subcode = "wse:UnableToRenew";
                reason  = "No explaination yet.";
                break;

            case WsFaultType.WseInvalidMessage:
                code    = "soap:Sender";
                subcode = "wse:InvalidMessage";
                reason  = "Message is not valid and cannot be processed.";
                break;
            }

            // Create the XmlWriter
            MemoryStream soapStream = new MemoryStream();
            XmlWriter    xmlWriter  = XmlWriter.Create(soapStream);

            // Generate the fault Header
            WsWsaHeader faultHeader = new WsWsaHeader(
                WsWellKnownUri.WsaNamespaceUri_2005_08 + "/fault", // Action
                header.MessageID,                                  // RelatesTo
                "urn:schemas-xmlsoap-org:ws:2005:08:fault",        // To
                null, null, null);                                 // ReplyTo, From, Any

            WsSoapMessageWriter.WriteSoapMessageStart(xmlWriter, WsSoapMessageWriter.Prefixes.Wsdp, null, faultHeader, null);

            // Generate fault Body
            xmlWriter.WriteStartElement("wsa", "Fault", null);

            xmlWriter.WriteStartElement("wsa", "Code", null);
            xmlWriter.WriteStartElement("wsa", "Value", null);
            xmlWriter.WriteString(code);
            xmlWriter.WriteEndElement(); // End Value
            xmlWriter.WriteStartElement("wsa", "Subcode", null);
            xmlWriter.WriteStartElement("wsa", "Value", null);
            xmlWriter.WriteString(subcode);
            xmlWriter.WriteEndElement(); // End Value
            xmlWriter.WriteEndElement(); // End Subcode
            xmlWriter.WriteEndElement(); // End Code

            xmlWriter.WriteStartElement("wsa", "Reason", null);
            xmlWriter.WriteStartElement("wsa", "Text", null);
            xmlWriter.WriteAttributeString("xml", "lang", null, "en");
            xmlWriter.WriteString(reason);
            xmlWriter.WriteEndElement(); // End Text
            xmlWriter.WriteEndElement(); // End Reason

            xmlWriter.WriteStartElement("wsdp", "Detail", null);
            xmlWriter.WriteString(details);
            xmlWriter.WriteEndElement(); // End Detail

            xmlWriter.WriteEndElement(); // End Fault

            WsSoapMessageWriter.WriteSoapMessageEnd(xmlWriter);

            // Flush and close writer. Return stream buffer
            xmlWriter.Flush();
            xmlWriter.Close();

            WsMessage response = new WsMessage(soapStream.ToArray());

            return(response);
        }
        internal static void ThrowFaultException(XmlReader reader, WsWsaHeader header)
        {
            WsFaultType type    = WsFaultType.Exception;
            string      message = "";
            string      detail  = "";
            string      subcode;

            reader.ReadStartElement("Body", WsWellKnownUri.SoapNamespaceUri);
            reader.ReadStartElement("Fault", WsWellKnownUri.SoapNamespaceUri);

            while (true)
            {
                if (reader.IsStartElement("Code", WsWellKnownUri.SoapNamespaceUri))
                {
                    reader.ReadStartElement(); //<Code>

                    if (reader.IsStartElement("Value", WsWellKnownUri.SoapNamespaceUri))
                    {
                        reader.ReadElementString();
                    }
                    if (reader.IsStartElement("Subcode", WsWellKnownUri.SoapNamespaceUri))
                    {
                        reader.ReadStartElement();
                        subcode = reader.ReadElementString("Value", WsWellKnownUri.SoapNamespaceUri);

                        int idx = subcode.IndexOf(':');

                        if (idx != -1)
                        {
                            subcode = subcode.Substring(idx + 1);
                        }

                        switch (subcode)
                        {
                        case "ArgumentException":
                            type = WsFaultType.ArgumentException;
                            break;

                        case "ArgumentNullException":
                            type = WsFaultType.ArgumentNullException;
                            break;

                        case "Exception":
                            type = WsFaultType.Exception;
                            break;

                        case "InvalidOperationException":
                            type = WsFaultType.InvalidOperationException;
                            break;

                        case "XmlException":
                            type = WsFaultType.XmlException;
                            break;

                        case "InvalidMessageInformationHeader":
                            type = WsFaultType.WsaInvalidMessageInformationHeader;
                            break;

                        case "MessageInformationHeaderRequired":
                            type = WsFaultType.WsaMessageInformationHeaderRequired;
                            break;

                        case "DestinationUnreachable":
                            type = WsFaultType.WsaDestinationUnreachable;
                            break;

                        case "ActionNotSupported":
                            type = WsFaultType.WsaActionNotSupported;
                            break;

                        case "EndpointUnavailable":
                            type = WsFaultType.WsaEndpointUnavailable;
                            break;

                        case "DeliverModeRequestedUnavailable":
                            type = WsFaultType.WseDeliverModeRequestedUnavailable;
                            break;

                        case "InvalidExpirationTime":
                            type = WsFaultType.WseInvalidExpirationTime;
                            break;

                        case "UnsupportedExpirationType":
                            type = WsFaultType.WseUnsupportedExpirationType;
                            break;

                        case "FilteringNotSupported":
                            type = WsFaultType.WseFilteringNotSupported;
                            break;

                        case "FilteringRequestedUnavailable":
                            type = WsFaultType.WseFilteringRequestedUnavailable;
                            break;

                        case "EventSourceUnableToProcess":
                            type = WsFaultType.WseEventSourceUnableToProcess;
                            break;

                        case "UnableToRenew":
                            type = WsFaultType.WseUnableToRenew;
                            break;

                        case "InvalidMessage":
                            type = WsFaultType.WseInvalidMessage;
                            break;
                        }

                        reader.ReadEndElement();
                    }

                    reader.ReadEndElement(); // </Code>
                }

                if (reader.IsStartElement("Reason", WsWellKnownUri.SoapNamespaceUri))
                {
                    reader.ReadStartElement();

                    message = reader.ReadElementString("Text", WsWellKnownUri.SoapNamespaceUri);

                    reader.ReadEndElement();
                }

                if (reader.IsStartElement("Detail", WsWellKnownUri.SoapNamespaceUri))
                {
                    detail = reader.ReadElementString("Detail", WsWellKnownUri.SoapNamespaceUri);
                }

                if (!reader.IsStartElement())
                {
                    break;
                }
            }

            reader.ReadEndElement(); // </Fault>
            reader.ReadEndElement(); // </Body>

            throw new WsFaultException(header, type, message, detail);
        }
 public WsFaultException(WsWsaHeader header, WsFaultType faultType, String message)
     : this(header, faultType, message, null)
 {
 }
        internal static WsMessage GenerateFaultResponse(WsWsaHeader header, WsFaultType faultType, String details, ProtocolVersion version)
        {
            String   code    = String.Empty;
            String   subcode = String.Empty;
            String   reason  = String.Empty;
            WsPrefix extraNS = WsPrefix.Wse;

            string faultAddress = null;

            if (header.FaultTo != null)
            {
                faultAddress = header.FaultTo.Address.OriginalString;
            }

            if (faultAddress == null)
            {
                faultAddress = version.AnonymousUri;
            }

            switch (faultType)
            {
            case WsFaultType.ArgumentException:
                code    = WsNamespacePrefix.Soap + ":Receiver";
                subcode = "ArgumentException";
                reason  = "One of the arguments provided to a method is not valid.";
                break;

            case WsFaultType.ArgumentNullException:
                code    = WsNamespacePrefix.Soap + ":Receiver";
                subcode = "ArgumentNullException";
                reason  = "A null reference was passed to a method that does not accept it as a valid argument.";
                break;

            case WsFaultType.Exception:
                code    = WsNamespacePrefix.Soap + ":Receiver";
                subcode = "Exception";
                reason  = "Errors occured during application execution.";
                break;

            case WsFaultType.InvalidOperationException:
                code    = WsNamespacePrefix.Soap + ":Receiver";
                subcode = "InvalidOperationException";
                reason  = "A method call is invalid for the object's current state.";
                break;

            case WsFaultType.XmlException:
                code    = WsNamespacePrefix.Soap + ":Receiver";
                subcode = "XmlException";
                reason  = "Syntax errors found during parsing.";
                break;

            case WsFaultType.WsaInvalidMessageInformationHeader:
                code    = WsNamespacePrefix.Soap + ":Sender";
                subcode = WsNamespacePrefix.Wsa + ":InvalidMessageInformationHeader";
                reason  = "A message information header is not valid and cannot be processed.";
                break;

            case WsFaultType.WsaMessageInformationHeaderRequired:
                code    = WsNamespacePrefix.Soap + ":Sender";
                subcode = WsNamespacePrefix.Wsa + ":MessageInformationHeaderRequired";
                reason  = "A required message Information header, To, MessageID, or Action, is not present";
                break;

            case WsFaultType.WsaDestinationUnreachable:
                code    = WsNamespacePrefix.Soap + ":Sender";
                subcode = WsNamespacePrefix.Wsa + ":DestinationUnreachable";
                reason  = "No route can be determined to reach the destination role defined by the WS=Addressing To.";
                break;

            case WsFaultType.WsaActionNotSupported:
                code    = WsNamespacePrefix.Soap + ":Sender";
                subcode = WsNamespacePrefix.Wsa + ":ActionNotSupported";
                reason  = "The [action] cannot be processed at the receiver.";
                break;

            case WsFaultType.WsaEndpointUnavailable:
                code    = WsNamespacePrefix.Soap + ":Receiver";
                subcode = WsNamespacePrefix.Wsa + ":EndpointUnavailable";
                reason  = "The endpoint is unable to process the message at this time.";
                break;

            case WsFaultType.WseDeliverModeRequestedUnavailable:
                code    = WsNamespacePrefix.Soap + ":Sender";
                subcode = WsNamespacePrefix.Wse + ":DeliverModeRequestedUnavailable";
                reason  = "The request delivery mode is not supported.";
                extraNS = WsPrefix.Wse;
                break;

            case WsFaultType.WseInvalidExpirationTime:
                code    = WsNamespacePrefix.Soap + ":Sender";
                subcode = WsNamespacePrefix.Wse + ":InvalidExpirationTime";
                reason  = "The expiration time requested is invalid.";
                extraNS = WsPrefix.Wse;
                break;

            case WsFaultType.WseUnsupportedExpirationType:
                code    = WsNamespacePrefix.Soap + ":Sender";
                subcode = WsNamespacePrefix.Wse + ":UnsupportedExpirationType";
                reason  = "Only expiration durations are supported.";
                extraNS = WsPrefix.Wse;
                break;

            case WsFaultType.WseFilteringNotSupported:
                code    = WsNamespacePrefix.Soap + ":Sender";
                subcode = WsNamespacePrefix.Wse + ":FilteringNotSupported";
                reason  = "Filtering is not supported.";
                extraNS = WsPrefix.Wse;
                break;

            case WsFaultType.WseFilteringRequestedUnavailable:
                code    = WsNamespacePrefix.Soap + ":Sender";
                subcode = WsNamespacePrefix.Wse + ":FilteringRequestedUnavailable";
                reason  = "The requested filter dialect is not supported.";
                extraNS = WsPrefix.Wse;
                break;

            case WsFaultType.WseEventSourceUnableToProcess:
                code    = WsNamespacePrefix.Soap + ":Receiver";
                subcode = WsNamespacePrefix.Wse + ":EventSourceUnableToProcess";
                reason  = "No explaination yet.";
                extraNS = WsPrefix.Wse;
                break;

            case WsFaultType.WseUnableToRenew:
                code    = WsNamespacePrefix.Soap + ":Receiver";
                subcode = WsNamespacePrefix.Wse + ":UnableToRenew";
                reason  = "No explaination yet.";
                extraNS = WsPrefix.Wse;
                break;

            case WsFaultType.WseInvalidMessage:
                code    = WsNamespacePrefix.Soap + ":Sender";
                subcode = WsNamespacePrefix.Wse + ":InvalidMessage";
                reason  = "Message is not valid and cannot be processed.";
                extraNS = WsPrefix.Wse;
                break;
            }

            // Create the XmlWriter
            using (XmlMemoryWriter xmlWriter = XmlMemoryWriter.Create())
            {
                // Generate the fault Header
                WsWsaHeader faultHeader = new WsWsaHeader(
                    version.AddressingNamespace + "/fault", // Action
                    header.MessageID,                       // RelatesTo
                    faultAddress,                           // To
                    null, null, null);                      // ReplyTo, From, Any

                WsMessage msg = new WsMessage(faultHeader, null, extraNS, null, null);

                WsSoapMessageWriter smw = new WsSoapMessageWriter(version);
                smw.WriteSoapMessageStart(xmlWriter, msg);

                // Generate fault Body
                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Fault", null);

                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Code", null);
                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Value", null);
                xmlWriter.WriteString(code);
                xmlWriter.WriteEndElement(); // End Value
                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Subcode", null);
                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Value", null);
                xmlWriter.WriteString(subcode);
                xmlWriter.WriteEndElement(); // End Value
                xmlWriter.WriteEndElement(); // End Subcode
                xmlWriter.WriteEndElement(); // End Code

                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Reason", null);
                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Text", null);
                xmlWriter.WriteAttributeString("xml", "lang", "http://www.w3.org/XML/1998/namespace", "en-US");
                xmlWriter.WriteString(reason);
                xmlWriter.WriteEndElement(); // End Text
                xmlWriter.WriteEndElement(); // End Reason

                xmlWriter.WriteStartElement(WsNamespacePrefix.Soap, "Detail", null);
                xmlWriter.WriteString(details);
                xmlWriter.WriteEndElement(); // End Detail

                xmlWriter.WriteEndElement(); // End Fault

                smw.WriteSoapMessageEnd(xmlWriter);

                msg.Body = xmlWriter.ToArray();

                // Flush and close writer. Return stream buffer
                return(msg);
            }
        }