public WebCallRequest(string taskID, string transferEncoding, WebData webData, bool first, bool complete) { this.TaskID = taskID; this.TransferEncoding = transferEncoding; this.WebData = webData; this.First = first; this.Complete = complete; }
// 追加数据 WebDataWrapper AddWrapper(string taskID, WebData data) { lock (_syncRoot) { WebDataWrapper wrapper = null; if (_webData_table.ContainsKey(taskID) == false) { wrapper = new WebDataWrapper(); _webData_table[taskID] = wrapper; } else { wrapper = (WebDataWrapper)_webData_table[taskID]; } wrapper.Append(data); return(wrapper); } }
// 追加数据 public void AddData(string taskID, WebData data) { AddWrapper(taskID, data); }
// 追加数据 public WebData AddData(string taskID, WebData data) { WebDataWrapper wrapper = AddWrapper(taskID, data); return(wrapper.WebData); }
// 将 data 的数据追加到本对象 public void Append(WebData data) { this.Touch(); // 激活一下最近时间 if (this.WebData == null) { this.WebData = new WebData(); } if (data.Headers != null) { if (this.WebData.Headers == null) { this.WebData.Headers = data.Headers; } else { this.WebData.Headers += data.Headers; } } #if NO if (data.Content != null) { if (this.WebData.Content == null) { #if VERIFY_CHUNK if (data.Offset != 0) { throw new Exception("第一个 chunk 其 Offset 应该为 0"); } #endif this.WebData.Content = data.Content; } else { #if VERIFY_CHUNK if (exist.WebData.Content.Length != data.Offset) { throw new Exception("累积 Content 的长度 " + exist.WebData.Content.Length + " 和当前 chunk 的 offset " + data.Offset.ToString() + " 不一致"); } #endif this.WebData.Content = ByteArray.Add(this.WebData.Content, data.Content); } } #endif if (data.Content != null) { if (this.Content == null) { this.Content = new List <byte>(4096); } this.Content.AddRange(data.Content); } if (data.Text != null) { #if NO if (exist.WebData.Text == null) { exist.WebData.Text = data.Text; } else { exist.WebData.Text += data.Text; } #endif if (this.Text == null) { this.Text = new StringBuilder(); } this.Text.Append(data.Text); } }
/* * 2016/11/9 1:20:05 1(测试): System.AggregateException: 发生一个或多个错误。 ---> System.AggregateException: 发生一个或多个错误。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。 * 在 DigitalPlatform.ByteArray.Remove(Byte[]& source, Int32 length) * 在 DigitalPlatform.Message.WebDataSplitter.<GetEnumerator>d__0.MoveNext() * 在 DigitalPlatform.MessageClient.MessageConnection.<WebCallAsyncLite>d__59.MoveNext() * --- 内部异常堆栈跟踪的结尾 --- * 在 System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) * 在 DigitalPlatform.MessageClient.MessageConnection.<>c__DisplayClass51.<WebCallTaskAsync>b__50() * 在 System.Threading.Tasks.Task`1.InnerInvoke() * 在 System.Threading.Tasks.Task.Execute() * --- 内部异常堆栈跟踪的结尾 --- * 在 System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) * 在 dp2Router.ServerInfo.WebCall(HttpRequest request, String transferEncoding) * ---> (内部异常 #0) System.AggregateException: 发生一个或多个错误。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。 * 在 DigitalPlatform.ByteArray.Remove(Byte[]& source, Int32 length) * 在 DigitalPlatform.Message.WebDataSplitter.<GetEnumerator>d__0.MoveNext() * 在 DigitalPlatform.MessageClient.MessageConnection.<WebCallAsyncLite>d__59.MoveNext() * --- 内部异常堆栈跟踪的结尾 --- * 在 System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) * 在 DigitalPlatform.MessageClient.MessageConnection.<>c__DisplayClass51.<WebCallTaskAsync>b__50() * 在 System.Threading.Tasks.Task`1.InnerInvoke() * 在 System.Threading.Tasks.Task.Execute() * ---> (内部异常 #0) System.NullReferenceException: 未将对象引用设置到对象的实例。 * 在 DigitalPlatform.ByteArray.Remove(Byte[]& source, Int32 length) * 在 DigitalPlatform.Message.WebDataSplitter.<GetEnumerator>d__0.MoveNext() * 在 DigitalPlatform.MessageClient.MessageConnection.<WebCallAsyncLite>d__59.MoveNext()<--- * <--- * 2016/11/10 增强了 content == null 情况 * */ public IEnumerator GetEnumerator() { if (this.ChunkSize == 0) { throw new Exception("尚未设置 ChunkSize"); } if (this.WebData == null) { throw new Exception("尚未设置 WebData"); } if (MessageUtil.IsTextEncoding(TransferEncoding) == true || TransferEncoding == "base64") { StringBuilder content = new StringBuilder(this.WebData.Text); for (int i = 0; ; i++) { WebData current = new WebData(); if (i == 0) { current.Headers = this.WebData.Headers; if (this.WebData.Headers.Length < this.ChunkSize) { current.Text = RemoveFrom(content, this.ChunkSize - this.WebData.Headers.Length); } } else { current.Headers = null; current.Text = RemoveFrom(content, this.ChunkSize); } _lastOne = content.Length == 0; yield return(current); if (content.Length == 0) { yield break; } _firstOne = false; } } else if (TransferEncoding == "content") { byte[] content = this.WebData.Content; #if VERIFY_CHUNK int content_send = 0; #endif for (int i = 0; ; i++) { WebData current = new WebData(); if (i == 0) { current.Headers = this.WebData.Headers; if (this.WebData.Headers.Length < this.ChunkSize) { current.Content = content == null ? null : ByteArray.Remove(ref content, this.ChunkSize - this.WebData.Headers.Length); } } else { current.Headers = null; current.Content = content == null ? null : ByteArray.Remove(ref content, this.ChunkSize); } #if VERIFY_CHUNK current.Offset = content_send; // content_send += current.Content.Length; #endif _lastOne = (content == null ? 0 : content.Length) == 0; yield return(current); if (content == null || content.Length == 0) { yield break; } _firstOne = false; } } else { throw new Exception("无法识别的 TransferEncoding '" + this.TransferEncoding + "'"); } }