/// <include file='doc\XmlReturnReader.uex' path='docs/doc[@for="XmlReturnReader.Read"]/*' /> public override object Read(WebResponse response, Stream responseStream) { try { if (response == null) { throw new ArgumentNullException("response"); } if (!ContentType.MatchesBase(response.ContentType, ContentType.TextXml)) { throw new InvalidOperationException(Res.GetString(Res.WebResultNotXml)); } Encoding e = RequestResponseUtils.GetEncoding(response.ContentType); StreamReader reader = new StreamReader(responseStream, e, true); TraceMethod caller = Tracing.On ? new TraceMethod(this, "Read") : null; if (Tracing.On) { Tracing.Enter(Tracing.TraceId(Res.TraceReadResponse), caller, new TraceMethod(xmlSerializer, "Deserialize", reader)); } object returnValue = xmlSerializer.Deserialize(reader); if (Tracing.On) { Tracing.Exit(Tracing.TraceId(Res.TraceReadResponse), caller); } return(returnValue); } finally { response.Close(); } }
public override object Read(WebResponse response, Stream responseStream) { object obj3; try { if (response == null) { throw new ArgumentNullException("response"); } if (!ContentType.MatchesBase(response.ContentType, "text/xml")) { throw new InvalidOperationException(Res.GetString("WebResultNotXml")); } Encoding encoding = RequestResponseUtils.GetEncoding(response.ContentType); StreamReader textReader = new StreamReader(responseStream, encoding, true); TraceMethod caller = Tracing.On ? new TraceMethod(this, "Read", new object[0]) : null; if (Tracing.On) { Tracing.Enter(Tracing.TraceId("TraceReadResponse"), caller, new TraceMethod(this.xmlSerializer, "Deserialize", new object[] { textReader })); } object obj2 = this.xmlSerializer.Deserialize(textReader); if (Tracing.On) { Tracing.Exit(Tracing.TraceId("TraceReadResponse"), caller); } obj3 = obj2; } finally { response.Close(); } return(obj3); }
/// <include file='doc\XmlReturnReader.uex' path='docs/doc[@for="XmlReturnReader.Read"]/*' /> public override object Read(WebResponse response, Stream responseStream) { try { if (response == null) { throw new ArgumentNullException("response"); } if (!ContentType.MatchesBase(response.ContentType, ContentType.TextXml)) { throw new InvalidOperationException(Res.GetString(Res.WebResultNotXml)); } Encoding e = RequestResponseUtils.GetEncoding(response.ContentType); return(xmlSerializer.Deserialize(new StreamReader(responseStream, e, true))); } finally { response.Close(); } }
object[] ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, bool asyncCall) { SoapClientMethod method = message.Method; // CONSIDER,yannc: use the SoapExtensionStream here as well so we throw exceptions // : if the extension touches stream properties/methods in before deserialize. // note that if there is an error status code then the response might be content-type=text/plain. 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); 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 if (!ContentType.IsSoap(message.ContentType)) { // 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) + "\r\n" + RequestResponseUtils.CreateResponseExceptionString(response, responseStream)); } } Encoding enc = RequestResponseUtils.GetEncoding(message.ContentType); // perf fix: changed buffer size passed to StreamReader int bufferSize; if (asyncCall || httpResponse == null) { bufferSize = 512; } else { int contentLength = (int)httpResponse.ContentLength; if (contentLength == -1) { bufferSize = 8000; } else if (contentLength <= 16000) { bufferSize = contentLength; } else { bufferSize = 16000; } } XmlTextReader reader; if (enc != null) { reader = new XmlTextReader(new StreamReader(message.Stream, enc, true, bufferSize)); } else { // CONSIDER: do i need to pass a buffer size somehow? reader = new XmlTextReader(message.Stream); } reader.Normalization = true; reader.XmlResolver = null; reader.MoveToContent(); // 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.Envelope); } else if (reader.NamespaceURI == Soap.Namespace) { reader.ReadStartElement(Soap.Envelope, Soap.Namespace); } else if (reader.NamespaceURI == Soap12.Namespace) { reader.ReadStartElement(Soap.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); reader.MoveToContent(); reader.ReadStartElement(Soap.Body, envelopeNs); reader.MoveToContent(); if (reader.IsStartElement(Soap.Fault, envelopeNs)) { message.SetException(ReadSoapException(reader)); } else { if (method.oneWay) { reader.Skip(); message.SetParameterValues(new object[0]); } else { // SOAP12: not using encodingStyle //message.SetParameterValues((object[])method.returnSerializer.Deserialize(reader, method.use == SoapBindingUse.Encoded ? encodingNs : null)); message.SetParameterValues((object[])method.returnSerializer.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.SetStage(SoapMessageStage.AfterDeserialize); message.RunExtensions(message.initializedExtensions); SoapHeaderHandling.SetHeaderMembers(message.Headers, this, method.outHeaderMappings, SoapHeaderDirection.Out | SoapHeaderDirection.Fault, true); if (message.Exception != null) { throw message.Exception; } return(message.GetParameterValues()); }
protected virtual XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize) { Encoding enc = message.SoapVersion == SoapProtocolVersion.Soap12 ? RequestResponseUtils.GetEncoding2(message.ContentType) : RequestResponseUtils.GetEncoding(message.ContentType); if (bufferSize < 512) { bufferSize = 512; } XmlTextReader reader; if (enc != null) { reader = new XmlTextReader(new StreamReader(message.Stream, enc, true, bufferSize)); } else { // reader = new XmlTextReader(message.Stream); } reader.DtdProcessing = DtdProcessing.Prohibit; reader.Normalization = true; reader.XmlResolver = null; return(reader); }
protected virtual XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize) { Encoding encoding = message.SoapVersion == SoapProtocolVersion.Soap12 ? RequestResponseUtils.GetEncoding2(message.ContentType) : RequestResponseUtils.GetEncoding(message.ContentType); if (bufferSize < 512) { bufferSize = 512; } XmlTextReader xmlTextReader = encoding == null ? new XmlTextReader(message.Stream) : new XmlTextReader((TextReader) new StreamReader(message.Stream, encoding, true, bufferSize)); xmlTextReader.DtdProcessing = DtdProcessing.Prohibit; xmlTextReader.Normalization = true; xmlTextReader.XmlResolver = (XmlResolver)null; return((XmlReader)xmlTextReader); }