Esempio n. 1
0
 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;
 }
Esempio n. 2
0
        // 追加数据
        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);
            }
        }
Esempio n. 3
0
 // 追加数据
 public void AddData(string taskID, WebData data)
 {
     AddWrapper(taskID, data);
 }
Esempio n. 4
0
        // 追加数据
        public WebData AddData(string taskID, WebData data)
        {
            WebDataWrapper wrapper = AddWrapper(taskID, data);

            return(wrapper.WebData);
        }
Esempio n. 5
0
        // 将 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);
            }
        }
Esempio n. 6
0
        /*
         * 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 + "'");
            }
        }