Пример #1
0
        internal override object[] ReadParameters()
        {
            object[] objArray2;
            this.message.InitExtensionStreamChain(this.message.otherExtensions);
            this.message.RunExtensions(this.message.otherExtensions, true);
            if (!ContentType.IsSoap(this.message.ContentType))
            {
                throw new SoapException(System.Web.Services.Res.GetString("WebRequestContent", new object[] { this.message.ContentType, this.helper.HttpContentType }), new XmlQualifiedName("Client", "http://schemas.xmlsoap.org/soap/envelope/"), new SoapFaultSubCode(Soap12FaultCodes.UnsupportedMediaTypeFaultCode));
            }
            XmlReader xmlReader = null;

            try
            {
                xmlReader = this.GetXmlReader();
                xmlReader.MoveToContent();
                this.SetHelper(SoapServerProtocolHelper.GetHelper(this, xmlReader.NamespaceURI));
            }
            catch (XmlException exception)
            {
                throw new SoapException(System.Web.Services.Res.GetString("WebRequestUnableToRead"), new XmlQualifiedName("Client", "http://schemas.xmlsoap.org/soap/envelope/"), exception);
            }
            this.CheckHelperVersion();
            if ((this.version == SoapProtocolVersion.Soap11) && !ContentType.MatchesBase(this.message.ContentType, this.helper.HttpContentType))
            {
                throw new SoapException(System.Web.Services.Res.GetString("WebRequestContent", new object[] { this.message.ContentType, this.helper.HttpContentType }), new XmlQualifiedName("Client", "http://schemas.xmlsoap.org/soap/envelope/"), new SoapFaultSubCode(Soap12FaultCodes.UnsupportedMediaTypeFaultCode));
            }
            if (this.message.Exception != null)
            {
                throw this.message.Exception;
            }
            try
            {
                object[] objArray;
                if (!xmlReader.IsStartElement("Envelope", this.helper.EnvelopeNs))
                {
                    throw new InvalidOperationException(System.Web.Services.Res.GetString("WebMissingEnvelopeElement"));
                }
                if (xmlReader.IsEmptyElement)
                {
                    throw new InvalidOperationException(System.Web.Services.Res.GetString("WebMissingBodyElement"));
                }
                int depth = xmlReader.Depth;
                xmlReader.ReadStartElement("Envelope", this.helper.EnvelopeNs);
                xmlReader.MoveToContent();
                bool   checkRequiredHeaders = ((this.serverMethod.wsiClaims & WsiProfiles.BasicProfile1_1) != WsiProfiles.None) && (this.version != SoapProtocolVersion.Soap12);
                string str = new SoapHeaderHandling().ReadHeaders(xmlReader, this.serverMethod.inHeaderSerializer, this.message.Headers, this.serverMethod.inHeaderMappings, SoapHeaderDirection.In, this.helper.EnvelopeNs, (this.serverMethod.use == SoapBindingUse.Encoded) ? this.helper.EncodingNs : null, checkRequiredHeaders);
                if (str != null)
                {
                    throw new SoapHeaderException(System.Web.Services.Res.GetString("WebMissingHeader", new object[] { str }), new XmlQualifiedName("MustUnderstand", "http://schemas.xmlsoap.org/soap/envelope/"));
                }
                if (!xmlReader.IsStartElement("Body", this.helper.EnvelopeNs))
                {
                    throw new InvalidOperationException(System.Web.Services.Res.GetString("WebMissingBodyElement"));
                }
                xmlReader.ReadStartElement("Body", this.helper.EnvelopeNs);
                xmlReader.MoveToContent();
                bool        flag2  = this.serverMethod.use == SoapBindingUse.Encoded;
                TraceMethod caller = Tracing.On ? new TraceMethod(this, "ReadParameters", new object[0]) : null;
                if (Tracing.On)
                {
                    Tracing.Enter(Tracing.TraceId("TraceReadRequest"), caller, new TraceMethod(this.serverMethod.parameterSerializer, "Deserialize", new object[] { xmlReader, (this.serverMethod.use == SoapBindingUse.Encoded) ? this.helper.EncodingNs : null }));
                }
                if (!flag2 && (WebServicesSection.Current.SoapEnvelopeProcessing.IsStrict || Tracing.On))
                {
                    XmlDeserializationEvents events = Tracing.On ? Tracing.GetDeserializationEvents() : RuntimeUtils.GetDeserializationEvents();
                    objArray = (object[])this.serverMethod.parameterSerializer.Deserialize(xmlReader, null, events);
                }
                else
                {
                    objArray = (object[])this.serverMethod.parameterSerializer.Deserialize(xmlReader, flag2 ? this.helper.EncodingNs : null);
                }
                if (Tracing.On)
                {
                    Tracing.Exit(Tracing.TraceId("TraceReadRequest"), caller);
                }
                while ((depth < xmlReader.Depth) && xmlReader.Read())
                {
                }
                if (xmlReader.NodeType == XmlNodeType.EndElement)
                {
                    xmlReader.Read();
                }
                this.message.SetParameterValues(objArray);
                objArray2 = objArray;
            }
            catch (SoapException)
            {
                throw;
            }
            catch (Exception exception2)
            {
                if (((exception2 is ThreadAbortException) || (exception2 is StackOverflowException)) || (exception2 is OutOfMemoryException))
                {
                    throw;
                }
                throw new SoapException(System.Web.Services.Res.GetString("WebRequestUnableToRead"), new XmlQualifiedName("Client", "http://schemas.xmlsoap.org/soap/envelope/"), exception2);
            }
            return(objArray2);
        }
Пример #2
0
        internal override object[] ReadParameters()
        {
            message.InitExtensionStreamChain(message.otherExtensions);
            message.RunExtensions(message.otherExtensions);

            // do a sanity check on the content-type before we check the version since otherwise the error might be really nasty
            if (!ContentType.IsSoap(message.ContentType))
            {
                throw new SoapException(Res.GetString(Res.WebRequestContent, message.ContentType, helper.HttpContentType),
                                        new XmlQualifiedName(Soap.ClientCode, Soap.Namespace), new SoapFaultSubcode(Soap12FaultCodes.UnsupportedMediaTypeFaultCode));
            }

            // now that all the extensions have run, establish the real version of the request
            SetHelper(SoapServerProtocolHelper.GetHelper(this));
            CheckHelperVersion();

            // now do a more specific content-type check for soap 1.1 only (soap 1.2 allows various xml content types)
            if (version == SoapProtocolVersion.Soap11 && !ContentType.MatchesBase(message.ContentType, helper.HttpContentType))
            {
                throw new SoapException(Res.GetString(Res.WebRequestContent, message.ContentType, helper.HttpContentType),
                                        new XmlQualifiedName(Soap.ClientCode, Soap.Namespace), new SoapFaultSubcode(Soap12FaultCodes.UnsupportedMediaTypeFaultCode));
            }

            try {
                XmlTextReader reader = SoapServerProtocolHelper.GetXmlTextReader(message.ContentType, message.Stream);
                reader.MoveToContent();
                reader.ReadStartElement(Soap.Envelope, helper.EnvelopeNs);
                reader.MoveToContent();

                new SoapHeaderHandling().ReadHeaders(reader, serverMethod.inHeaderSerializer, message.Headers, serverMethod.inHeaderMappings, SoapHeaderDirection.In, helper.EnvelopeNs, serverMethod.use == SoapBindingUse.Encoded ? helper.EncodingNs : null);

                reader.MoveToContent();
                reader.ReadStartElement(Soap.Body, helper.EnvelopeNs);
                reader.MoveToContent();

                // SOAP12: not using encodingStyle
                //object[] values = (object[])serverMethod.parameterSerializer.Deserialize(reader, serverMethod.use == SoapBindingUse.Encoded ? helper.EncodingNs : null);
                object[] values = (object[])serverMethod.parameterSerializer.Deserialize(reader);

                while (reader.NodeType == XmlNodeType.Whitespace)
                {
                    reader.Skip();
                }
                if (reader.NodeType == XmlNodeType.None)
                {
                    reader.Skip();
                }
                else
                {
                    reader.ReadEndElement();
                }
                while (reader.NodeType == XmlNodeType.Whitespace)
                {
                    reader.Skip();
                }
                if (reader.NodeType == XmlNodeType.None)
                {
                    reader.Skip();
                }
                else
                {
                    reader.ReadEndElement();
                }

                message.SetParameterValues(values);

                return(values);
            }
            catch (SoapException) {
                throw;
            }
            catch (Exception e) {
                throw new SoapException(Res.GetString(Res.WebRequestUnableToRead), new XmlQualifiedName(Soap.ClientCode, Soap.Namespace), e);
            }
        }