private void PrepareWebRequestForContentUpload(HttpWebRequest webRequest, HttpRequestMessage request) { HttpContent requestContent = request.Content; if (requestContent == null) { // If we have no content, we set the Content-Length to 0, regardless of the Transfer-Encoding header. webRequest.ContentLength = 0; } else { MediaTypeHeaderValue contentType = requestContent.Headers.ContentType; if (contentType != null) { webRequest.ContentType = contentType.ToString(); } // Determine how to communicate the length of the request content. if (request.Headers.TransferEncodingChunked == true) { webRequest.SendChunked = true; } else { long?contentLength = requestContent.Headers.ContentLength; if (contentLength != null) { webRequest.ContentLength = (long)contentLength; } else { // If we don't have a content length and we don't use chunked, then we must buffer the content. // If the user specified a zero buffer size, we throw. if (maxRequestContentBufferSize == 0) { throw new HttpException( "The content length of the request content can't be determined. Either set TransferEncodingChunked to true, load content into buffer, or set AllowRequestContentBuffering to true."); } // HttpContent couldn't calculate the content length. Chunked is not specified. Buffer the // content to get the content length. // Note that we call LoadIntoBuffer() synchronously since the scenario where neither the length // is known nor chunked is used, often means that we're about to serialize in-memory data like // XML, objects, feed content, etc. I.e. loading sync results in better perf. than async. // If customers want to use async buffering (e.g. the source is a network stream with // unknown length), LoadIntoBufferAsync() can be called before sending the request. In this // case the length is known and we'll not end up here. requestContent.LoadIntoBuffer(maxRequestContentBufferSize); contentLength = requestContent.Headers.ContentLength; Contract.Assert(contentLength != null, "After buffering content, ContentLength must not be null."); webRequest.ContentLength = (long)contentLength; } } } }