示例#1
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);
            }
        }