/// <summary> /// Get the request stream /// </summary> /// <param name="request">The request</param> /// <returns>The Request stream</returns> private Task <Stream> GetWebRequestStream(IEwsHttpWebRequest request) { // In the async case, although we can use async callback to make the entire worflow completely async, // there is little perf gain with this approach because of EWS's message nature. // The overall latency of BeginGetRequestStream() is same as GetRequestStream() in this case. // The overhead to implement a two-step async operation includes wait handle synchronization, exception handling and wrapping. // Therefore, we only leverage BeginGetResponse() and EndGetResponse() to provide the async functionality. // Reference: http://www.wintellect.com/CS/blogs/jeffreyr/archive/2009/02/08/httpwebrequest-its-request-stream-and-sending-data-in-chunks.aspx return(request.GetRequestStream()); }
/// <summary> /// Executes this instance. /// </summary> /// <returns></returns> internal AutodiscoverResponse InternalExecute() { this.Validate(); try { IEwsHttpWebRequest request = this.Service.PrepareHttpWebRequestForUrl(this.Url); this.Service.TraceHttpRequestHeaders(TraceFlags.AutodiscoverRequestHttpHeaders, request); bool needSignature = this.Service.Credentials != null && this.Service.Credentials.NeedSignature; bool needTrace = this.Service.IsTraceEnabledFor(TraceFlags.AutodiscoverRequest); using (Stream requestStream = request.GetRequestStream()) { using (MemoryStream memoryStream = new MemoryStream()) { using (EwsServiceXmlWriter writer = new EwsServiceXmlWriter(this.Service, memoryStream)) { writer.RequireWSSecurityUtilityNamespace = needSignature; this.WriteSoapRequest( this.Url, writer); } if (needSignature) { this.service.Credentials.Sign(memoryStream); } if (needTrace) { memoryStream.Position = 0; this.Service.TraceXml(TraceFlags.AutodiscoverRequest, memoryStream); } EwsUtilities.CopyStream(memoryStream, requestStream); } } using (IEwsHttpWebResponse webResponse = request.GetResponse()) { if (AutodiscoverRequest.IsRedirectionResponse(webResponse)) { AutodiscoverResponse response = this.CreateRedirectionResponse(webResponse); if (response != null) { return(response); } else { throw new ServiceRemoteException(Strings.InvalidRedirectionResponseReturned); } } using (Stream responseStream = AutodiscoverRequest.GetResponseStream(webResponse)) { using (MemoryStream memoryStream = new MemoryStream()) { // Copy response stream to in-memory stream and reset to start EwsUtilities.CopyStream(responseStream, memoryStream); memoryStream.Position = 0; this.Service.TraceResponse(webResponse, memoryStream); EwsXmlReader ewsXmlReader = new EwsXmlReader(memoryStream); // WCF may not generate an XML declaration. ewsXmlReader.Read(); if (ewsXmlReader.NodeType == XmlNodeType.XmlDeclaration) { ewsXmlReader.ReadStartElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName); } else if ((ewsXmlReader.NodeType != XmlNodeType.Element) || (ewsXmlReader.LocalName != XmlElementNames.SOAPEnvelopeElementName) || (ewsXmlReader.NamespaceUri != EwsUtilities.GetNamespaceUri(XmlNamespace.Soap))) { throw new ServiceXmlDeserializationException(Strings.InvalidAutodiscoverServiceResponse); } this.ReadSoapHeaders(ewsXmlReader); AutodiscoverResponse response = this.ReadSoapBody(ewsXmlReader); ewsXmlReader.ReadEndElement(XmlNamespace.Soap, XmlElementNames.SOAPEnvelopeElementName); if (response.ErrorCode == AutodiscoverErrorCode.NoError) { return(response); } else { throw new AutodiscoverResponseException(response.ErrorCode, response.ErrorMessage); } } } } } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null) { IEwsHttpWebResponse httpWebResponse = this.Service.HttpWebRequestFactory.CreateExceptionResponse(ex); if (AutodiscoverRequest.IsRedirectionResponse(httpWebResponse)) { this.Service.ProcessHttpResponseHeaders( TraceFlags.AutodiscoverResponseHttpHeaders, httpWebResponse); AutodiscoverResponse response = this.CreateRedirectionResponse(httpWebResponse); if (response != null) { return(response); } } else { this.ProcessWebException(ex); } } // Wrap exception if the above code block didn't throw throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ex.Message), ex); } catch (XmlException ex) { this.Service.TraceMessage( TraceFlags.AutodiscoverConfiguration, string.Format("XML parsing error: {0}", ex.Message)); // Wrap exception throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ex.Message), ex); } catch (IOException ex) { this.Service.TraceMessage( TraceFlags.AutodiscoverConfiguration, string.Format("I/O error: {0}", ex.Message)); // Wrap exception throw new ServiceRequestException(string.Format(Strings.ServiceRequestFailed, ex.Message), ex); } }