/// <summary> /// Creates a new instance of the <see cref="EwsServiceMultiResponseXmlReader"/> class. /// </summary> /// <param name="stream">The stream.</param> /// <param name="service">The service.</param> /// <returns>an instance of EwsServiceMultiResponseXmlReader wrapped around the input stream.</returns> internal static EwsServiceMultiResponseXmlReader Create(Stream stream, ExchangeService service) { EwsServiceMultiResponseXmlReader reader = new EwsServiceMultiResponseXmlReader(stream, service); return reader; }
/// <summary> /// Parses the responses. /// </summary> /// <param name="state">The state.</param> private void ParseResponses(object state) { try { Guid traceId = Guid.Empty; HangingTraceStream tracingStream = null; MemoryStream responseCopy = null; try { bool traceEwsResponse = this.Service.IsTraceEnabledFor(TraceFlags.EwsResponse); using (Stream responseStream = this.response.GetResponseStream()) { tracingStream = new HangingTraceStream(responseStream, this.Service); // EwsServiceMultiResponseXmlReader.Create causes a read. if (traceEwsResponse) { responseCopy = new MemoryStream(); tracingStream.SetResponseCopy(responseCopy); } EwsServiceMultiResponseXmlReader ewsXmlReader = EwsServiceMultiResponseXmlReader.Create(tracingStream, this.Service); while (this.IsConnected) { object responseObject = null; if (traceEwsResponse) { try { responseObject = this.ReadResponse(ewsXmlReader, this.response.Headers); } finally { this.Service.TraceXml(TraceFlags.EwsResponse, responseCopy); } // reset the stream collector. responseCopy.Dispose(); responseCopy = new MemoryStream(); tracingStream.SetResponseCopy(responseCopy); } else { responseObject = this.ReadResponse(ewsXmlReader, this.response.Headers); } this.responseHandler(responseObject); } } } catch (TimeoutException ex) { // The connection timed out. this.Disconnect(HangingRequestDisconnectReason.Timeout, ex); return; } catch (IOException ex) { // Stream is closed, so disconnect. this.Disconnect(HangingRequestDisconnectReason.Exception, ex); return; } catch (HttpRequestException ex) { // Stream is closed, so disconnect. this.Disconnect(HangingRequestDisconnectReason.Exception, ex); return; } catch (WebException ex) { // Stream is closed, so disconnect. this.Disconnect(HangingRequestDisconnectReason.Exception, ex); return; } catch (ObjectDisposedException ex) { // Stream is closed, so disconnect. this.Disconnect(HangingRequestDisconnectReason.Exception, ex); return; } catch (NotSupportedException) { // This is thrown if we close the stream during a read operation due to a user method call. // Trying to delay closing until the read finishes simply results in a long-running connection. this.Disconnect(HangingRequestDisconnectReason.UserInitiated, null); return; } catch (XmlException ex) { // Thrown if server returned no XML document. this.Disconnect(HangingRequestDisconnectReason.UserInitiated, ex); return; } finally { if (responseCopy != null) { responseCopy.Dispose(); responseCopy = null; } } } catch (ServiceLocalException exception) { this.Disconnect(HangingRequestDisconnectReason.Exception, exception); } }
/// <summary> /// Creates a new instance of the <see cref="EwsServiceMultiResponseXmlReader"/> class. /// </summary> /// <param name="stream">The stream.</param> /// <param name="service">The service.</param> /// <returns>an instance of EwsServiceMultiResponseXmlReader wrapped around the input stream.</returns> internal static EwsServiceMultiResponseXmlReader Create(Stream stream, ExchangeService service) { EwsServiceMultiResponseXmlReader reader = new EwsServiceMultiResponseXmlReader(stream, service); return(reader); }