protected override async Task FillDataTo(System.Net.WebRequest webrqst, CancellationToken cancellationToken, IProgress <ProgressReport> progress) { progress.ReportWhenNotNull(() => ProgressReport .CreateNew(RequestResponseSteps .Requesting_N_Uploading, 0, 1)); var qd = System.Text.Encoding.UTF8.GetBytes(JsonClientHelper.GetQueryData(RequestData.PostFieldValues)); webrqst.ContentType = "application/x-www-form-urlencoded"; #if SILVERLIGHT_4 || SILVERLIGHT_5 || DOTNET45 webrqst.ContentLength = qd.Length; #endif var rqstStrm = await webrqst.GetRequestStreamAsync().ConfigureAwait(false); await rqstStrm.WriteAsync(qd, 0, qd.Length).ConfigureAwait(false); progress.ReportWhenNotNull(() => ProgressReport .CreateNew(RequestResponseSteps .Requesting_N_Uploading, 1, 1)); }
protected override async Task FillDataTo(System.Net.WebRequest webRequest, CancellationToken cancellationToken, IProgress <ProgressReport> progress) { var memStream = new MemoryStream(); // 边界符 var boundary = "---------------" + DateTime.Now.Ticks.ToString("x"); // 边界符 var beginBoundary = Encoding.UTF8.GetBytes("--" + boundary + "\r\n"); //var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); // 最后的结束符 var endBoundary = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n"); // 设置属性 webRequest.ContentType = "multipart/form-data; boundary=" + boundary; // 写入文件 const string filePartHeader = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" + "Content-Type: application/octet-stream\r\n\r\n"; foreach (var fileKvp in RequestData.UploadFiles) { var value = fileKvp.Value; memStream.Write(beginBoundary, 0, beginBoundary.Length); var header = string.Format(filePartHeader, fileKvp.Key, value.LocalPath); var headerbytes = Encoding.UTF8.GetBytes(header); memStream.Write(headerbytes, 0, headerbytes.Length); var stream = await value.StreamFactory.ConfigureAwait(false); await stream.CopyToAsync(memStream).ConfigureAwait(false); // await memStream.WriteAsync(beginBoundary, 0, beginBoundary.Length); memStream.Write(CRLFBYTES, 0, CRLFBYTES.Length); } if (cancellationToken.IsCancellationRequested) { cancellationToken.ThrowIfCancellationRequested(); } // 写入字符串的Key var stringKeyHeader = "Content-Disposition: form-data; name=\"{0}\"" + "\r\n\r\n{1}\r\n"; foreach (byte[] formitembytes in ( this.RequestData.PostFieldValues .SelectMany(kvp => kvp.Value.Select(x => new { kvp.Key, Value = x })) ) .Select( keyvp => { return(string.Format(stringKeyHeader, keyvp.Key, keyvp.Value)); } ) .Select ( str => Encoding.UTF8.GetBytes(str) )) { memStream.Write(beginBoundary, 0, beginBoundary.Length); memStream.Write(formitembytes, 0, formitembytes.Length); } // 写入最后的结束边界符 memStream.Write(endBoundary, 0, endBoundary.Length); #if SILVERLIGHT_4 || SILVERLIGHT_5 || DOTNET45 webRequest.ContentLength = memStream.Length; #endif if (cancellationToken.IsCancellationRequested) { cancellationToken.ThrowIfCancellationRequested(); } var requestStream = await webRequest.GetRequestStreamAsync().ConfigureAwait(false); memStream.Position = 0; //await memStream.CopyToAsync(requestStream, 512 * 1024, cancellationToken); var total = memStream.Length; var current = 0; var buffer = new byte[4096]; var sourceStream = memStream; var eof = false; while (!eof) { progress.ReportWhenNotNull(() => ProgressReport.CreateNew(RequestResponseSteps.Requesting_N_Uploading, current, total)); cancellationToken.ThrowIfCancellationRequested(); var readCount = await sourceStream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false); current = current + readCount; eof = (readCount == 0); if (!eof) { requestStream.Write(buffer, 0, readCount); } } //requestStream.Close(); }
internal async Task <JsonResponse <TResponse> > GetJsonResponse <TResponse>(Uri baseUri, Uri relativeUri, CancellationToken cancellationToken, IProgress <ProgressReport> progress, AuthToken token = null) { progress.ReportWhenNotNull(() => ProgressReport.CreateNew(RequestResponseSteps.PreparingUrl_N_Headers, 0, 1)); //验证对于一般的请求参数修改 if (token != null) { var baseUrl = JsonClientHelper.GetBaseUriBuilder(baseUri, relativeUri, this.RequestData.UrlTemplateValues).Uri.ToString(); token.FillToContext(baseUrl, this); } var uri = new Uri(JsonClientHelper.GetAbsoultUrl(baseUri, relativeUri, this.RequestData.QueryStringValues, this.RequestData.UrlTemplateValues)); #if DOTNET45 var webrqst = WebRequest.CreateDefault(uri); #else var webrqst = WebRequest.Create(uri); #endif webrqst.Method = RequestMethod; //验证对于底层请求参数修改 if (token != null) { token.FillToWebRequest(webrqst, this); } FillToHeader(webrqst); progress.ReportWhenNotNull(() => ProgressReport.CreateNew(RequestResponseSteps.PreparingUrl_N_Headers, 1, 1)); await FillDataTo(webrqst, cancellationToken, progress).ConfigureAwait(false); if (typeof(WebRequest) == (typeof(TResponse))) { var o = new JsonResponse <WebRequest>(webrqst, webrqst, null, null); progress.ReportWhenNotNull(() => ProgressReport.CreateNew(RequestResponseSteps.Deserializing, 1, 1)); return(o as JsonResponse <TResponse>); } using (var webrsps = await webrqst.GetResponseAsync().ConfigureAwait(false)) { if (typeof(WebResponse) == (typeof(TResponse))) { var o = new JsonResponse <WebResponse>(webrsps, webrqst, webrsps, null); progress.ReportWhenNotNull(() => ProgressReport.CreateNew(RequestResponseSteps.Deserializing, 1, 1)); return(o as JsonResponse <TResponse>); } #if SILVERLIGHT_4 || SILVERLIGHT_5 || WINDOWS_PHONE_7 var h = new Dictionary <string, string[]>(); #endif #if DOTNET45 || WINDOWS_PHONE_8 var h = webrsps.Headers.AllKeys .Select(k => new { k, v = webrsps.Headers[k].Split(',') }) .ToDictionary(x => x.k, x => x.v); #endif #if NETFX_CORE var h = webrsps.Headers.AllKeys .Select(k => new { k, v = webrsps.Headers[k].Split(',') }) .ToDictionary(x => x.k, x => x.v); #endif var ms = new MemoryStream(); var total = webrsps.ContentLength; var current = 0; var buffer = new byte[4096]; var sourceStream = webrsps.GetResponseStream(); var eof = false; while (!eof) { progress.ReportWhenNotNull(new Func <ProgressReport> (() => ProgressReport.CreateNew(RequestResponseSteps.GettingResponse, current, total))); cancellationToken.ThrowIfCancellationRequested(); var readCount = await sourceStream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false); current = current + readCount; eof = (readCount == 0); if (!eof) { ms.Write(buffer, 0, readCount); } } if (typeof(Stream) == (typeof(TResponse))) { ms.Seek(0, SeekOrigin.Begin); var value = ms; var o = new JsonResponse <Stream>(value, webrqst, webrsps, ms); progress.ReportWhenNotNull(() => ProgressReport.CreateNew(RequestResponseSteps.Deserializing, 1, 1)); return(o as JsonResponse <TResponse>); } else { try { progress.ReportWhenNotNull(() => ProgressReport.CreateNew(RequestResponseSteps.Deserializing, 0, 1)); ms.Seek(0, SeekOrigin.Begin); var value = (TResponse)JsonSerializerCache <TResponse> .Serializer.ReadObject(ms); ms.Seek(0, SeekOrigin.Begin); var o = new JsonResponse <TResponse>(value, webrqst, webrsps, ms); progress.ReportWhenNotNull(() => ProgressReport.CreateNew(RequestResponseSteps.Deserializing, 1, 1)); return(o); } catch (Exception ex) { ms.Seek(0, SeekOrigin.Begin); return(new JsonResponse <TResponse>( default(TResponse), webrqst, webrsps, ms, new JsonContractException("Serializing exception", ex, ms, h) )); } } } }