Esempio n. 1
0
 public WsMessage(WsWsaHeader header, object body, WsPrefix prefixes, WsXmlNamespaces namespaces, WsAppSequence appSequence)
 {
     this.Header      = header;
     this.Body        = body;
     this.Prefixes    = prefixes;
     this.Namespaces  = namespaces;
     this.AppSequence = appSequence;
 }
Esempio n. 2
0
 public WsMessage( WsWsaHeader header, object body, WsPrefix prefixes, WsXmlNamespaces namespaces, WsAppSequence appSequence)
 {
     this.Header      = header;
     this.Body        = body;
     this.Prefixes    = prefixes;
     this.Namespaces  = namespaces;
     this.AppSequence = appSequence;
 }
Esempio n. 3
0
        public String WriteSoapMessageStart(XmlWriter writer, WsPrefix prefixes, WsXmlNamespaces additionalPrefixes, WsWsaHeader header, WsAppSequence appSequence, bool fSendHeader)
        {
            String messageId = "urn:uuid:" + Guid.NewGuid();

            String xml =
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                "<s:Envelope xmlns:s=\"" + WsWellKnownUri.SoapNamespaceUri + "\" " +
                "xmlns:a=\"" + m_version.AddressingNamespace + "\" ";

            if ((prefixes & WsPrefix.Wsdp) != WsPrefix.None)
            {
                xml += "xmlns:p=\"" + m_version.WsdpNamespaceUri + "\" ";
            }

            if ((prefixes & WsPrefix.Wse) != WsPrefix.None)
            {
                xml += "xmlns:e=\"" + WsWellKnownUri.WseNamespaceUri + "\" ";
            }

            if ((prefixes & WsPrefix.Wsx) != WsPrefix.None)
            {
                xml += "xmlns:x=\"" + WsWellKnownUri.WsxNamespaceUri + "\" ";
            }

            if ((prefixes & WsPrefix.Wsd) != WsPrefix.None || appSequence != null)
            {
                xml += "xmlns:d=\"" + m_version.DiscoveryNamespace + "\" ";
            }

            if (additionalPrefixes != null)
            {
                int            count = additionalPrefixes.Count;
                WsXmlNamespace current;
                for (int i = 0; i < count; i++)
                {
                    current = additionalPrefixes[i];
                    xml    += "xmlns:" + current.Prefix + "=\"" + current.NamespaceURI + "\" ";
                }
            }

            xml += ">";

            if (fSendHeader)
            {
                xml +=
                    "<s:Header>" +
                    "<a:Action" + (header.MustUnderstand ? " s:mustUnderstand=\"1\">" : ">") + header.Action + "</a:Action>" +
                    "<a:MessageID>" + messageId + "</a:MessageID>" +
                    "<a:To" + (header.MustUnderstand ? " s:mustUnderstand=\"1\">" : ">") + header.To + "</a:To>";

                if (header.RelatesTo != null)
                {
                    xml += "<a:RelatesTo>" + header.RelatesTo + "</a:RelatesTo>";
                }

                if (header.From != null)
                {
                    xml += "<a:From><a:Address>" + header.From.Address.AbsoluteUri + "</a:Address></a:From>";
                }

                if (header.ReplyTo != null)
                {
                    xml += "<a:ReplyTo><a:Address>" + header.ReplyTo.Address.AbsoluteUri + "</a:Address></a:ReplyTo>";
                }

                if (appSequence != null)
                {
                    xml += "<d:AppSequence InstanceId=\"" + appSequence.InstanceId + "\" ";

                    if (appSequence.SequenceId != null)
                    {
                        xml += "SequenceId=\"" + appSequence.SequenceId + "\" ";
                    }

                    xml += "MessageNumber=\"" + appSequence.MessageNumber + "\"/>";
                }

                writer.WriteRaw(xml);

                if (header.Any != null)
                {
                    header.Any.WriteTo(writer);
                }

                writer.WriteRaw("</s:Header>");
            }
            else
            {
                writer.WriteRaw(xml);
            }

            writer.WriteRaw("<s:Body>");

            return(messageId);
        }
        public String WriteSoapMessageStart(XmlWriter writer, WsPrefix prefixes, WsXmlNamespaces additionalPrefixes, WsWsaHeader header, WsAppSequence appSequence, bool fSendHeader)
        {
            String messageId = "urn:uuid:" + Guid.NewGuid();

            String xml =
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                "<s:Envelope xmlns:s=\"" + WsWellKnownUri.SoapNamespaceUri + "\" " +
                "xmlns:a=\"" + m_version.AddressingNamespace + "\" ";

            if ((prefixes & WsPrefix.Wsdp) != WsPrefix.None)
            {
                xml += "xmlns:p=\"" + m_version.WsdpNamespaceUri + "\" ";
            }

            if ((prefixes & WsPrefix.Wse) != WsPrefix.None)
            {
                xml += "xmlns:e=\"" + WsWellKnownUri.WseNamespaceUri + "\" ";
            }

            if ((prefixes & WsPrefix.Wsx) != WsPrefix.None)
            {
                xml += "xmlns:x=\"" + WsWellKnownUri.WsxNamespaceUri + "\" ";
            }

            if ((prefixes & WsPrefix.Wsd) != WsPrefix.None || appSequence != null)
            {
                xml += "xmlns:d=\"" + m_version.DiscoveryNamespace + "\" ";
            }

            if (additionalPrefixes != null)
            {
                int count = additionalPrefixes.Count;
                WsXmlNamespace current;
                for (int i = 0; i < count; i++)
                {
                    current = additionalPrefixes[i];
                    xml += "xmlns:" + current.Prefix + "=\"" + current.NamespaceURI + "\" ";
                }
            }

            xml += ">";

            if(fSendHeader)
            {
                xml +=
                    "<s:Header>" +
                    "<a:Action" + (header.MustUnderstand ? " s:mustUnderstand=\"1\">" : ">") + header.Action + "</a:Action>" +
                    "<a:MessageID>" + messageId + "</a:MessageID>" +
                    "<a:To" + (header.MustUnderstand ? " s:mustUnderstand=\"1\">" : ">") + header.To + "</a:To>";

                if (header.RelatesTo != null)
                {
                    xml += "<a:RelatesTo>" + header.RelatesTo + "</a:RelatesTo>";
                }

                if (header.From != null)
                {
                    xml += "<a:From><a:Address>" + header.From.Address.AbsoluteUri + "</a:Address></a:From>";
                }

                if (header.ReplyTo != null)
                {
                    xml += "<a:ReplyTo><a:Address>" + header.ReplyTo.Address.AbsoluteUri + "</a:Address></a:ReplyTo>";
                }

                if (appSequence != null)
                {
                    xml += "<d:AppSequence InstanceId=\"" + appSequence.InstanceId + "\" ";

                    if(appSequence.SequenceId != null)
                    {
                        xml += "SequenceId=\"" + appSequence.SequenceId + "\" ";
                    }
                    
                    xml += "MessageNumber=\"" + appSequence.MessageNumber + "\"/>";
                }

                writer.WriteRaw(xml);

                if (header.Any != null)
                {
                    header.Any.WriteTo(writer);
                }

                writer.WriteRaw("</s:Header>");
            }
            else
            {
                writer.WriteRaw(xml);
            }

            writer.WriteRaw("<s:Body>");

            return messageId;
        }
Esempio n. 5
0
 public WsMessage(WsWsaHeader header, object body, WsPrefix prefixes)
 {
     this.Header   = header;
     this.Body     = body;
     this.Prefixes = prefixes;
 }
Esempio n. 6
0
 public WsMessage( WsWsaHeader header, object body, WsPrefix prefixes )
 {
     this.Header   = header;
     this.Body     = body;
     this.Prefixes = prefixes;
 }
Esempio n. 7
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

                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);
            }
        }