示例#1
0
        public static XmlReader ParseSoapMessage(byte[] soapMessage, ref WsWsaHeader header, ProtocolVersion version)
        {
            MemoryStream requestStream = new MemoryStream(soapMessage);
            XmlReader    reader        = XmlReader.Create(requestStream);

            header = new WsWsaHeader();

            try
            {
                reader.ReadStartElement("Envelope", WsWellKnownUri.SoapNamespaceUri);
#if DEBUG
                int depth = reader.Depth;
#endif
                header.ParseHeader(reader, version);
#if DEBUG
                Microsoft.SPOT.Debug.Assert(XmlReaderHelper.HasReadCompleteNode(depth, reader));
#endif
                reader.ReadStartElement("Body", WsWellKnownUri.SoapNamespaceUri);
            }
            catch (XmlException e)
            {
                reader.Close();
                throw new WsFaultException(header, WsFaultType.XmlException, e.ToString());
            }

            return(reader);
        }
示例#2
0
        /// <summary>
        /// Processes a message
        /// </summary>
        /// <param name="stream">The message being processed.</param>
        /// <param name="ctx">The context associated with the message.</param>
        /// <returns>The handling status for this operation.</returns>
        protected override ChainResult OnProcessInputMessage(ref WsMessage msg, BindingContext ctx)
        {
            if (msg == null)
            {
                return(ChainResult.Abort);
            }

            ArrayList props = ctx.BindingProperties;

            if (props != null)
            {
                int len = props.Count;

                for (int j = 0; j < len; j++)
                {
                    BindingProperty prop = (BindingProperty)props[j];

                    if (prop.Name == HttpKnownHeaderNames.ContentType)
                    {
                        string strContentType = ((string)prop.Value).ToLower();

                        if (strContentType.IndexOf("multipart/related;") == 0)
                        {
                            // Create the mtom header class
                            msg.MtomPropeties = new WsMtomParams();

                            // Parse Mtom Content-Type parameters
                            string[] fields    = strContentType.Substring(18).Split(';');
                            int      fieldsLen = fields.Length;
                            for (int i = 0; i < fieldsLen; ++i)
                            {
                                string type = fields[i];
                                int    idx  = type.IndexOf('=');

                                if (idx != -1)
                                {
                                    string param = type.Substring(0, idx).Trim();
                                    string value = type.Substring(idx + 1).Trim('\"');
                                    switch (param.ToUpper())
                                    {
                                    case "BOUNDARY":
                                        if (param.Length > 72)
                                        {
                                            throw new ArgumentException("Mime boundary element length exceeded.", "boundary");
                                        }
                                        msg.MtomPropeties.boundary = value;
                                        break;

                                    case "TYPE":
                                        msg.MtomPropeties.type = value;
                                        break;

                                    case "START":
                                        msg.MtomPropeties.start = value;
                                        break;

                                    case "START-INFO":
                                        msg.MtomPropeties.startInfo = value;
                                        break;

                                    default:
                                        break;
                                    }
                                }
                            }

                            // Check required Mtom fields
                            if (msg.MtomPropeties.boundary == null || msg.MtomPropeties.type == null || msg.MtomPropeties.start == null)
                            {
                                throw new WsFaultException(msg.Header, WsFaultType.WseInvalidMessage);
                            }

                            WsMtom mtom = new WsMtom((byte[])msg.Body);

                            msg.Body      = mtom.ParseMessage(msg.MtomPropeties.boundary);
                            msg.BodyParts = mtom.BodyParts;
                        }
                        else if (strContentType.IndexOf("application/soap+xml") != 0)
                        {
                            throw new WsFaultException(msg.Header, WsFaultType.WseInvalidMessage);
                        }
                    }
                }
            }

            if (msg.Body == null)
            {
                return(ChainResult.Continue);
            }

            MemoryStream requestStream = new MemoryStream((byte[])msg.Body);

            XmlReader   reader = XmlReader.Create(requestStream);
            WsWsaHeader hdr    = new WsWsaHeader();

            reader.ReadStartElement("Envelope", WsWellKnownUri.SoapNamespaceUri);

            reader.MoveToContent();
            if (ctx.Version.IncludeSoapHeaders || reader.LocalName == "Header")
            {
                hdr.ParseHeader(reader, ctx.Version);
            }

            msg.Header = hdr;

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


            if (msg.Deserializer != null)
            {
                msg.Body = ((DataContractSerializer)msg.Deserializer).ReadObject(reader);
                reader.Dispose();
            }
            else
            {
                msg.Reader = reader;
            }

            return(ChainResult.Continue);
        }