GetRequestStreamAsync() public method

public GetRequestStreamAsync ( ) : System.Threading.Tasks.Task
return System.Threading.Tasks.Task
Ejemplo n.º 1
0
        /// <summary>
        /// 发送指定的 form data 数据。
        /// </summary>
        /// <param name="request">WebRequest 扩展实例</param>
        /// <param name="data">提交数据时所需要的数据。可使用 <code>new { name = "xxx" }</code> 匿名对象的形式提供。</param>
        /// <param name="encoding">对于提交的数据的编码格式。null表示使用默认的 UTF-8 编码格式。</param>
        /// <returns>当前 <see cref="WebRequest"/> 实例。</returns>
        /// <exception cref="System.ArgumentNullException">data</exception>
        public static async Task <WebResponse> PushDataAsync(this WebRequest request, object data, Encoding encoding = null)
        {
            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }


            var form_data = string.Empty;

            if (data.GetType() != typeof(string))
            {
                var properties = new Dictionary <string, string>();

                foreach (var propInfo in data.GetType().GetRuntimeProperties())
                {
                    properties.Add(propInfo.Name, propInfo.GetValue(data).ToString());
                }

                form_data = properties.Select(kvp => $"{kvp.Key}={kvp.Value}").Aggregate((prev, next) => $"{prev}&{next}");
            }
            else
            {
                form_data = data.ToString();
            }

            var buffer = form_data.ToBytes(encoding);

            using (var stream = await request.GetRequestStreamAsync())
            {
                stream.Write(buffer, 0, buffer.Length);
            }
            return(await request.GetResponseAsync());
        }
        public void SetUp()
        {
            var uri = OAuthRequestHandler.OAuthRequestUri;
            var factory = new TestWebRequestFactory();
            factory.RegisterResultForUri(uri.AbsoluteUri, "null");
            _request = factory.Create(uri);

            _stream = new MemoryStream();
            _request.EndGetRequestStream(Arg.Any<IAsyncResult>()).Returns(c => _stream);
            _request.GetRequestStreamAsync().Returns(async c => (Stream)_stream);

            _handler = new OAuthRequestHandler(new ApiConfiguration("<<clientid>>", "<<clientsecret>>", "http://desktop/"));

        }
Ejemplo n.º 3
0
        /// <summary>
        /// Creates a <see cref="T:Task"/> that represents sending all of the data to the <see cref="T:WebRequest"/>.
        /// </summary>
        /// <param name="webRequest">The <see cref="T:WebRequest"/> instance.</param>
        /// <param name="data">A data object to be sent alone with the <see cref="T:WebRequest"/>.</param>
        /// <returns>A <see cref="T:Task"/> objected returned after sending data to a <see cref="T:WebRequest"/>.</returns>
        public static Task PostDataAsync(this WebRequest webRequest, object data)
        {
            Contract.Requires(webRequest != null);
            Contract.Requires(data != null);

            byte[] buffer;
            var    sb = new StringBuilder();

            foreach (PropertyInfo pi in data.GetType().GetProperties())
            {
                sb.Append((sb.Length == 0 ? String.Empty : "&") + pi.Name + "=" + Uri.UnescapeDataString(pi.GetValue(data, null).ToString()));
            }

            buffer = Encoding.ASCII.GetBytes(sb.ToString());

            webRequest.ContentLength = buffer.Length;
            webRequest.Method        = WebRequestMethods.Http.Post;
            webRequest.ContentType   = "application/x-www-form-urlencoded";

            return(webRequest.GetRequestStreamAsync().ContinueWith(stream =>
            {
                return stream.Result.WriteAsync(buffer, 0, buffer.Length);
            }).Unwrap());
        }
Ejemplo n.º 4
0
		async Task<byte[]> UploadValuesTaskAsyncCore (WebRequest request, NameValueCollection data,
		                                              CancellationToken token)
		{
			token.ThrowIfCancellationRequested ();
			string cType = Headers ["Content-Type"];
			if (cType != null && String.Compare (cType, urlEncodedCType, true) != 0)
				throw new WebException ("Content-Type header cannot be changed from its default " +
							"value for this request.");

			WebResponse response = null;

			Headers ["Content-Type"] = urlEncodedCType;
			try {
				MemoryStream tmpStream = new MemoryStream ();
				foreach (string key in data) {
					byte [] bytes = Encoding.UTF8.GetBytes (key);
					UrlEncodeAndWrite (tmpStream, bytes);
					tmpStream.WriteByte ((byte) '=');
					bytes = Encoding.UTF8.GetBytes (data [key]);
					UrlEncodeAndWrite (tmpStream, bytes);
					tmpStream.WriteByte ((byte) '&');
				}

				token.ThrowIfCancellationRequested ();
				
				int length = (int) tmpStream.Length;
				if (length > 0)
					tmpStream.SetLength (--length); // remove trailing '&'
				
				byte [] buf = tmpStream.GetBuffer ();
				request.ContentLength = length;
				using (Stream rqStream = await request.GetRequestStreamAsync ()) {
					await rqStream.WriteAsync (buf, 0, length, token);
				}
				tmpStream.Close ();

				response = await GetWebResponseTaskAsync (request, token);
				return await ReadAllTaskAsync (request, response, token);
			} finally {
				if (response != null)
					response.Close ();
			}
		}
Ejemplo n.º 5
0
		async Task<byte[]> UploadFileTaskAsyncCore (WebRequest request, string method,
		                                            string fileName, CancellationToken token)
		{
			token.ThrowIfCancellationRequested ();

			string fileCType = Headers ["Content-Type"];
			if (fileCType != null) {
				string lower = fileCType.ToLower ();
				if (lower.StartsWith ("multipart/"))
					throw new WebException ("Content-Type cannot be set to a multipart" +
								" type for this request.");
			} else {
				fileCType = "application/octet-stream";
			}

			bool needs_boundary = (method != "PUT"); // only verified case so far
			string boundary = null;
			if (needs_boundary) {
				boundary = "------------" + DateTime.Now.Ticks.ToString ("x");
				Headers ["Content-Type"] = String.Format ("multipart/form-data; boundary={0}", boundary);
			}
			Stream reqStream = null;
			Stream fStream = null;
			WebResponse response = null;

			fileName = Path.GetFullPath (fileName);

			try {
				fStream = File.OpenRead (fileName);
				token.ThrowIfCancellationRequested ();
				reqStream = await request.GetRequestStreamAsync ();
				token.ThrowIfCancellationRequested ();
				byte [] bytes_boundary = null;
				if (needs_boundary) {
					bytes_boundary = Encoding.ASCII.GetBytes (boundary);
					using (MemoryStream ms = new MemoryStream ()) {
						ms.WriteByte ((byte) '-');
						ms.WriteByte ((byte) '-');
						ms.Write (bytes_boundary, 0, bytes_boundary.Length);
						ms.WriteByte ((byte) '\r');
						ms.WriteByte ((byte) '\n');
						string partHeaders = String.Format (
							"Content-Disposition: form-data; " +
							"name=\"file\"; filename=\"{0}\"\r\n" +
							"Content-Type: {1}\r\n\r\n",
							Path.GetFileName (fileName), fileCType);
						byte [] partHeadersBytes = Encoding.UTF8.GetBytes (partHeaders);
						ms.Write (partHeadersBytes, 0, partHeadersBytes.Length);
						await ms.CopyToAsync (reqStream, (int)ms.Position, token);
					}
				}
				int nread;
				long bytes_sent = 0;
				long file_size = -1;
				long step = 16384; // every 16kB
				if (fStream.CanSeek) {
					file_size = fStream.Length;
					step = file_size / 100;
				}
				var upload_args = new UploadProgressChangedEventArgs (0, 0, bytes_sent, file_size, 0, null);
				OnUploadProgressChanged (upload_args);
				byte [] buffer = new byte [4096];
				long sum = 0;
				token.ThrowIfCancellationRequested ();
				while ((nread = await fStream.ReadAsync (buffer, 0, 4096, token)) > 0) {
					token.ThrowIfCancellationRequested ();
					await reqStream.WriteAsync (buffer, 0, nread, token);
					bytes_sent += nread;
					sum += nread;
					if (sum >= step || nread < 4096) {
						int percent = 0;
						if (file_size > 0)
							percent = (int) (bytes_sent * 100 / file_size);
						upload_args = new UploadProgressChangedEventArgs (0, 0, bytes_sent, file_size, percent, null);
						OnUploadProgressChanged (upload_args);
						sum = 0;
					}
				}

				if (needs_boundary) {
					using (MemoryStream ms = new MemoryStream ()) {
						ms.WriteByte ((byte) '\r');
						ms.WriteByte ((byte) '\n');
						ms.WriteByte ((byte) '-');
						ms.WriteByte ((byte) '-');
						ms.Write (bytes_boundary, 0, bytes_boundary.Length);
						ms.WriteByte ((byte) '-');
						ms.WriteByte ((byte) '-');
						ms.WriteByte ((byte) '\r');
						ms.WriteByte ((byte) '\n');
						await ms.CopyToAsync (reqStream, (int)ms.Position, token);
					}
				}
				reqStream.Close ();
				reqStream = null;

				response = await GetWebResponseTaskAsync (request, token);
				return await ReadAllTaskAsync (request, response, token);
			} finally {
				if (fStream != null)
					fStream.Close ();

				if (reqStream != null)
					reqStream.Close ();

				if (response != null)
					response.Close ();
			}
		}
Ejemplo n.º 6
0
		async Task<byte[]> UploadDataTaskAsyncCore (WebRequest request, byte[] data, CancellationToken token)
		{
			token.ThrowIfCancellationRequested ();

			int contentLength = data.Length;
			request.ContentLength = contentLength;
			using (Stream stream = await request.GetRequestStreamAsync ()) {
				token.ThrowIfCancellationRequested ();
				await stream.WriteAsync (data, 0, contentLength, token);
				token.ThrowIfCancellationRequested ();
			}

			WebResponse response = null;

			try {
				response = await GetWebResponseTaskAsync (request, token);
				return await ReadAllTaskAsync (request, response, token);
			} finally {
				if (response != null)
					response.Close ();
			}
		}
        private async Task SendRequestAsync(WebRequest request)
        {
            using (Stream requestStream = await request.GetRequestStreamAsync().ConfigureAwait(false))
            {
                await requestStream.WriteAsync(this.Content, 0, this.Content.Length).ConfigureAwait(false);
            }

            using (WebResponse response = await request.GetResponseAsync().ConfigureAwait(false))
            {
            }
        }
Ejemplo n.º 8
0
		async Task<byte[]> UploadValuesTaskAsyncCore (WebRequest request, NameValueCollection data,
		                                              CancellationToken token)
		{
			token.ThrowIfCancellationRequested ();

			WebResponse response = null;
			try {
				MemoryStream tmpStream = new MemoryStream ();
				foreach (string key in data) {
					byte [] bytes = Encoding.UTF8.GetBytes (key);
					UrlEncodeAndWrite (tmpStream, bytes);
					tmpStream.WriteByte ((byte) '=');
					bytes = Encoding.UTF8.GetBytes (data [key]);
					UrlEncodeAndWrite (tmpStream, bytes);
					tmpStream.WriteByte ((byte) '&');
				}

				token.ThrowIfCancellationRequested ();
				
				int length = (int) tmpStream.Length;
				if (length > 0)
					tmpStream.SetLength (--length); // remove trailing '&'
				
				byte [] buf = tmpStream.GetBuffer ();
				request.ContentLength = length;
				using (Stream rqStream = await request.GetRequestStreamAsync ().ConfigureAwait (false)) {
					await rqStream.WriteAsync (buf, 0, length, token).ConfigureAwait (false);
				}
				tmpStream.Close ();

				response = await GetWebResponseTaskAsync (request, token).ConfigureAwait (false);
				return await ReadAllTaskAsync (request, response, token).ConfigureAwait (false);
			} finally {
				if (response != null)
					response.Close ();
			}
		}
Ejemplo n.º 9
0
 /// <summary>
 /// 	Sets the body stream of the HTTP request.
 /// </summary>
 /// <param name="request">Request that is being executed.</param>
 /// <param name="body">Body that is to be set with the HTTP request.</param>
 static async Task SetBodyStream(WebRequest request, byte[] body)
 {
     try
     {
         var stream = await request.GetRequestStreamAsync();
         stream.WriteTimeout = 30 * 1000;
         stream.Write(body, 0, body.Length);
         stream.Flush();
         stream.Close();
         stream.Dispose();
     }
     catch (Exception ex)
     {
         Debug.WriteLine("[AsyncRequest][SetBodyStream] Error streaming Body of the request: {0}", ex.Message);
     }
 }
Ejemplo n.º 10
0
		private async Task<ServiceResponse> SendDataAsyncAwait(WebRequest request, byte[] data)
		{
			try
			{
				var stream = await request.GetRequestStreamAsync();
				stream.Write(data, 0, data.Length);
			}
			catch (AggregateException ae)
			{
				throw MappedAggregateException(ae);
			}

			return SendRequestAsyncAwait(request);
		}
        private async Task<HttpWebResponseWrapper> SendRequestAsync(WebRequest request)
        {
            using (Stream requestStream = await request.GetRequestStreamAsync().ConfigureAwait(false))
            {
                await requestStream.WriteAsync(this.Content, 0, this.Content.Length).ConfigureAwait(false);
            }

            using (WebResponse response = await request.GetResponseAsync().ConfigureAwait(false))
            {
                HttpWebResponseWrapper wrapper = null;
                
                var httpResponse = response as HttpWebResponse;
                if (httpResponse != null)
                {
                    // Return content only for 206 for performance reasons
                    // Currently we do not need it in other cases
                    if (httpResponse.StatusCode == HttpStatusCode.PartialContent)
                    {
                        wrapper = new HttpWebResponseWrapper
                        {
                            StatusCode = (int)httpResponse.StatusCode,
                        };

                        if (httpResponse.Headers != null)
                        {
                            wrapper.RetryAfterHeader = httpResponse.Headers["Retry-After"];
                        }

                        using (StreamReader content = new StreamReader(httpResponse.GetResponseStream()))
                        {
                            wrapper.Content = content.ReadToEnd();
                        }
                    }
                }

                return wrapper;
            }
        }