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); }
private object[] ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, bool asyncCall) { SoapClientMethod method = message.Method; HttpWebResponse httpWebResponse = response as HttpWebResponse; int num1 = httpWebResponse != null ? (int)httpWebResponse.StatusCode : -1; if (num1 >= 300 && num1 != 500 && num1 != 400) { throw new WebException(RequestResponseUtils.CreateResponseExceptionString((WebResponse)httpWebResponse, responseStream), (Exception)null, WebExceptionStatus.ProtocolError, (WebResponse)httpWebResponse); } message.Headers.Clear(); message.SetStream(responseStream); message.InitExtensionStreamChain(message.initializedExtensions); message.SetStage(SoapMessageStage.BeforeDeserialize); message.ContentType = response.ContentType; message.ContentEncoding = ((NameValueCollection)response.Headers)["Content-Encoding"]; message.RunExtensions(message.initializedExtensions, false); if (method.oneWay && (httpWebResponse == null || httpWebResponse.StatusCode != HttpStatusCode.InternalServerError)) { return(new object[0]); } bool flag1 = ContentType.IsSoap(message.ContentType); if (!flag1 || flag1 && httpWebResponse != null && httpWebResponse.ContentLength == 0L) { if (num1 == 400) { throw new WebException(RequestResponseUtils.CreateResponseExceptionString((WebResponse)httpWebResponse, responseStream), (Exception)null, WebExceptionStatus.ProtocolError, (WebResponse)httpWebResponse); } throw new InvalidOperationException(System.Web.Services.Res.GetString("WebResponseContent", (object)message.ContentType, (object)this.HttpContentType) + Environment.NewLine + RequestResponseUtils.CreateResponseExceptionString(response, responseStream)); } else { if (message.Exception != null) { throw message.Exception; } int bufferSize = asyncCall || httpWebResponse == null ? 512 : RequestResponseUtils.GetBufferSize((int)httpWebResponse.ContentLength); XmlReader readerForMessage = this.GetReaderForMessage(message, bufferSize); if (readerForMessage == null) { throw new InvalidOperationException(System.Web.Services.Res.GetString("WebNullReaderForMessage")); } int num2 = (int)readerForMessage.MoveToContent(); int depth = readerForMessage.Depth; string encodingNs = this.EncodingNs; string namespaceUri = readerForMessage.NamespaceURI; if (namespaceUri == null || namespaceUri.Length == 0) { readerForMessage.ReadStartElement("Envelope"); } else if (readerForMessage.NamespaceURI == "http://schemas.xmlsoap.org/soap/envelope/") { readerForMessage.ReadStartElement("Envelope", "http://schemas.xmlsoap.org/soap/envelope/"); } else if (readerForMessage.NamespaceURI == "http://www.w3.org/2003/05/soap-envelope") { readerForMessage.ReadStartElement("Envelope", "http://www.w3.org/2003/05/soap-envelope"); } else { throw new SoapException(System.Web.Services.Res.GetString("WebInvalidEnvelopeNamespace", (object)namespaceUri, (object)this.EnvelopeNs), SoapException.VersionMismatchFaultCode); } int num3 = (int)readerForMessage.MoveToContent(); new SoapHeaderHandling().ReadHeaders(readerForMessage, method.outHeaderSerializer, message.Headers, method.outHeaderMappings, SoapHeaderDirection.Out | SoapHeaderDirection.Fault, namespaceUri, method.use == SoapBindingUse.Encoded ? encodingNs : (string)null, false); int num4 = (int)readerForMessage.MoveToContent(); readerForMessage.ReadStartElement("Body", namespaceUri); int num5 = (int)readerForMessage.MoveToContent(); if (readerForMessage.IsStartElement("Fault", namespaceUri)) { message.Exception = this.ReadSoapException(readerForMessage); } else if (method.oneWay) { readerForMessage.Skip(); message.SetParameterValues(new object[0]); } else { TraceMethod caller = Tracing.On ? new TraceMethod((object)this, "ReadResponse", new object[0]) : (TraceMethod)null; bool flag2 = method.use == SoapBindingUse.Encoded; if (Tracing.On) { Tracing.Enter(Tracing.TraceId("TraceReadResponse"), caller, new TraceMethod((object)method.returnSerializer, "Deserialize", new object[2] { (object)readerForMessage, flag2 ? (object)encodingNs : (object)(string)null })); } if (!flag2 && (WebServicesSection.Current.SoapEnvelopeProcessing.IsStrict || Tracing.On)) { XmlDeserializationEvents events = Tracing.On ? Tracing.GetDeserializationEvents() : RuntimeUtils.GetDeserializationEvents(); message.SetParameterValues((object[])method.returnSerializer.Deserialize(readerForMessage, (string)null, events)); } else { message.SetParameterValues((object[])method.returnSerializer.Deserialize(readerForMessage, flag2 ? encodingNs : (string)null)); } if (Tracing.On) { Tracing.Exit(Tracing.TraceId("TraceReadResponse"), caller); } } do { ; }while (depth < readerForMessage.Depth && readerForMessage.Read()); if (readerForMessage.NodeType == XmlNodeType.EndElement) { readerForMessage.Read(); } message.SetStage(SoapMessageStage.AfterDeserialize); message.RunExtensions(message.initializedExtensions, false); SoapHeaderHandling.SetHeaderMembers(message.Headers, (object)this, method.outHeaderMappings, SoapHeaderDirection.Out | SoapHeaderDirection.Fault, true); if (message.Exception != null) { throw message.Exception; } else { return(message.GetParameterValues()); } } }
object[] ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, bool asyncCall) { SoapClientMethod method = message.Method; // HttpWebResponse httpResponse = response as HttpWebResponse; int statusCode = httpResponse != null ? (int)httpResponse.StatusCode : -1; if (statusCode >= 300 && statusCode != 500 && statusCode != 400) { throw new WebException(RequestResponseUtils.CreateResponseExceptionString(httpResponse, responseStream), null, WebExceptionStatus.ProtocolError, httpResponse); } message.Headers.Clear(); message.SetStream(responseStream); message.InitExtensionStreamChain(message.initializedExtensions); message.SetStage(SoapMessageStage.BeforeDeserialize); message.ContentType = response.ContentType; message.ContentEncoding = response.Headers[ContentType.ContentEncoding]; message.RunExtensions(message.initializedExtensions, false); if (method.oneWay && (httpResponse == null || (int)httpResponse.StatusCode != 500)) { return(new object[0]); } // this statusCode check is just so we don't repeat the contentType check we did above bool isSoap = ContentType.IsSoap(message.ContentType); if (!isSoap || (isSoap && (httpResponse != null) && (httpResponse.ContentLength == 0))) { // special-case 400 since we exempted it above on the off-chance it might be a soap 1.2 sender fault. // based on the content-type, it looks like it's probably just a regular old 400 if (statusCode == 400) { throw new WebException(RequestResponseUtils.CreateResponseExceptionString(httpResponse, responseStream), null, WebExceptionStatus.ProtocolError, httpResponse); } else { throw new InvalidOperationException(Res.GetString(Res.WebResponseContent, message.ContentType, HttpContentType) + Environment.NewLine + RequestResponseUtils.CreateResponseExceptionString(response, responseStream)); } } if (message.Exception != null) { throw message.Exception; } // perf fix: changed buffer size passed to StreamReader int bufferSize; if (asyncCall || httpResponse == null) { bufferSize = 512; } else { bufferSize = RequestResponseUtils.GetBufferSize((int)httpResponse.ContentLength); } XmlReader reader = GetReaderForMessage(message, bufferSize); if (reader == null) { throw new InvalidOperationException(Res.GetString(Res.WebNullReaderForMessage)); } reader.MoveToContent(); int depth = reader.Depth; // should be able to handle no ns, soap 1.1 ns, or soap 1.2 ns string encodingNs = EncodingNs; string envelopeNs = reader.NamespaceURI; if (envelopeNs == null || envelopeNs.Length == 0) { // ok to omit namespace -- assume correct version reader.ReadStartElement(Soap.Element.Envelope); } else if (reader.NamespaceURI == Soap.Namespace) { reader.ReadStartElement(Soap.Element.Envelope, Soap.Namespace); } else if (reader.NamespaceURI == Soap12.Namespace) { reader.ReadStartElement(Soap.Element.Envelope, Soap12.Namespace); } else { throw new SoapException(Res.GetString(Res.WebInvalidEnvelopeNamespace, envelopeNs, EnvelopeNs), SoapException.VersionMismatchFaultCode); } reader.MoveToContent(); SoapHeaderHandling headerHandler = new SoapHeaderHandling(); headerHandler.ReadHeaders(reader, method.outHeaderSerializer, message.Headers, method.outHeaderMappings, SoapHeaderDirection.Out | SoapHeaderDirection.Fault, envelopeNs, method.use == SoapBindingUse.Encoded ? encodingNs : null, false); reader.MoveToContent(); reader.ReadStartElement(Soap.Element.Body, envelopeNs); reader.MoveToContent(); if (reader.IsStartElement(Soap.Element.Fault, envelopeNs)) { message.Exception = ReadSoapException(reader); } else { if (method.oneWay) { reader.Skip(); message.SetParameterValues(new object[0]); } else { TraceMethod caller = Tracing.On ? new TraceMethod(this, "ReadResponse") : null; bool isEncodedSoap = method.use == SoapBindingUse.Encoded; if (Tracing.On) { Tracing.Enter(Tracing.TraceId(Res.TraceReadResponse), caller, new TraceMethod(method.returnSerializer, "Deserialize", reader, isEncodedSoap ? encodingNs : null)); } bool useDeserializationEvents = !isEncodedSoap && (WebServicesSection.Current.SoapEnvelopeProcessing.IsStrict || Tracing.On); if (useDeserializationEvents) { XmlDeserializationEvents events = Tracing.On ? Tracing.GetDeserializationEvents() : RuntimeUtils.GetDeserializationEvents(); message.SetParameterValues((object[])method.returnSerializer.Deserialize(reader, null, events)); } else { message.SetParameterValues((object[])method.returnSerializer.Deserialize(reader, isEncodedSoap ? encodingNs : null)); } if (Tracing.On) { Tracing.Exit(Tracing.TraceId(Res.TraceReadResponse), caller); } } } // Consume soap:Body and soap:Envelope closing tags while (depth < reader.Depth && reader.Read()) { // Nothing, just read on } // consume end tag if (reader.NodeType == XmlNodeType.EndElement) { reader.Read(); } message.SetStage(SoapMessageStage.AfterDeserialize); message.RunExtensions(message.initializedExtensions, false); SoapHeaderHandling.SetHeaderMembers(message.Headers, this, method.outHeaderMappings, SoapHeaderDirection.Out | SoapHeaderDirection.Fault, true); if (message.Exception != null) { throw message.Exception; } return(message.GetParameterValues()); }
private object[] ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, bool asyncCall) { int bufferSize; SoapClientMethod method = message.Method; HttpWebResponse response2 = response as HttpWebResponse; int num = (response2 != null) ? ((int)response2.StatusCode) : -1; if (((num >= 300) && (num != 500)) && (num != 400)) { throw new WebException(RequestResponseUtils.CreateResponseExceptionString(response2, responseStream), null, WebExceptionStatus.ProtocolError, response2); } message.Headers.Clear(); message.SetStream(responseStream); message.InitExtensionStreamChain(message.initializedExtensions); message.SetStage(SoapMessageStage.BeforeDeserialize); message.ContentType = response.ContentType; message.ContentEncoding = response.Headers["Content-Encoding"]; message.RunExtensions(message.initializedExtensions, false); if (method.oneWay && ((response2 == null) || (response2.StatusCode != HttpStatusCode.InternalServerError))) { return(new object[0]); } bool flag = ContentType.IsSoap(message.ContentType); if (!flag || ((flag && (response2 != null)) && (response2.ContentLength == 0L))) { if (num == 400) { throw new WebException(RequestResponseUtils.CreateResponseExceptionString(response2, responseStream), null, WebExceptionStatus.ProtocolError, response2); } throw new InvalidOperationException(System.Web.Services.Res.GetString("WebResponseContent", new object[] { message.ContentType, this.HttpContentType }) + Environment.NewLine + RequestResponseUtils.CreateResponseExceptionString(response, responseStream)); } if (message.Exception != null) { throw message.Exception; } if (asyncCall || (response2 == null)) { bufferSize = 0x200; } else { bufferSize = RequestResponseUtils.GetBufferSize((int)response2.ContentLength); } XmlReader readerForMessage = this.GetReaderForMessage(message, bufferSize); if (readerForMessage == null) { throw new InvalidOperationException(System.Web.Services.Res.GetString("WebNullReaderForMessage")); } readerForMessage.MoveToContent(); int depth = readerForMessage.Depth; string encodingNs = this.EncodingNs; string namespaceURI = readerForMessage.NamespaceURI; if ((namespaceURI == null) || (namespaceURI.Length == 0)) { readerForMessage.ReadStartElement("Envelope"); } else if (readerForMessage.NamespaceURI == "http://schemas.xmlsoap.org/soap/envelope/") { readerForMessage.ReadStartElement("Envelope", "http://schemas.xmlsoap.org/soap/envelope/"); } else { if (readerForMessage.NamespaceURI != "http://www.w3.org/2003/05/soap-envelope") { throw new SoapException(System.Web.Services.Res.GetString("WebInvalidEnvelopeNamespace", new object[] { namespaceURI, this.EnvelopeNs }), SoapException.VersionMismatchFaultCode); } readerForMessage.ReadStartElement("Envelope", "http://www.w3.org/2003/05/soap-envelope"); } readerForMessage.MoveToContent(); new SoapHeaderHandling().ReadHeaders(readerForMessage, method.outHeaderSerializer, message.Headers, method.outHeaderMappings, SoapHeaderDirection.Fault | SoapHeaderDirection.Out, namespaceURI, (method.use == SoapBindingUse.Encoded) ? encodingNs : null, false); readerForMessage.MoveToContent(); readerForMessage.ReadStartElement("Body", namespaceURI); readerForMessage.MoveToContent(); if (readerForMessage.IsStartElement("Fault", namespaceURI)) { message.Exception = this.ReadSoapException(readerForMessage); } else if (method.oneWay) { readerForMessage.Skip(); message.SetParameterValues(new object[0]); } else { TraceMethod caller = Tracing.On ? new TraceMethod(this, "ReadResponse", new object[0]) : null; bool flag2 = method.use == SoapBindingUse.Encoded; if (Tracing.On) { Tracing.Enter(Tracing.TraceId("TraceReadResponse"), caller, new TraceMethod(method.returnSerializer, "Deserialize", new object[] { readerForMessage, flag2 ? encodingNs : null })); } if (!flag2 && (WebServicesSection.Current.SoapEnvelopeProcessing.IsStrict || Tracing.On)) { XmlDeserializationEvents events = Tracing.On ? Tracing.GetDeserializationEvents() : RuntimeUtils.GetDeserializationEvents(); message.SetParameterValues((object[])method.returnSerializer.Deserialize(readerForMessage, null, events)); } else { message.SetParameterValues((object[])method.returnSerializer.Deserialize(readerForMessage, flag2 ? encodingNs : null)); } if (Tracing.On) { Tracing.Exit(Tracing.TraceId("TraceReadResponse"), caller); } } while ((depth < readerForMessage.Depth) && readerForMessage.Read()) { } if (readerForMessage.NodeType == XmlNodeType.EndElement) { readerForMessage.Read(); } message.SetStage(SoapMessageStage.AfterDeserialize); message.RunExtensions(message.initializedExtensions, false); SoapHeaderHandling.SetHeaderMembers(message.Headers, this, method.outHeaderMappings, SoapHeaderDirection.Fault | SoapHeaderDirection.Out, true); if (message.Exception != null) { throw message.Exception; } return(message.GetParameterValues()); }