public static WebHeaderCollection Clone(this WebHeaderCollection source)
        {
            if (source is null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            WebHeaderCollection webHeaderCollection = new WebHeaderCollection();

            source.CopyTo(webHeaderCollection);

            return(webHeaderCollection);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 创建网络请求
        /// </summary>
        /// <param name="uri">请求地址</param>
        /// <param name="method">方法</param>
        /// <param name="data">写入的数据</param>
        /// <param name="refer">引用页</param>
        /// <param name="saveToFile">保存文件地址</param>
        /// <param name="streamInvoker">流读取对象,仅当返回结果为流时可用</param>
        /// <param name="async"></param>
        /// <param name="result"></param>
        /// <param name="isXhr"></param>
        /// <param name="contextData">关联的上下文数据</param>
        /// <param name="headers">额外的要发出去的标头</param>
        /// <param name="contentType">设置当发送对象类型时,设置发送类型</param>
        /// <param name="allowAutoRedirect">设置当服务器发送3xx代码时是否自动跟踪跳转</param>
        /// <param name="targetStream">要写入的目标流</param>
        /// <param name="extra">额外的请求数据</param>
        /// <typeparam name="TResult">结果类型</typeparam>
        /// <returns></returns>
        public HttpContext <TResult> Create <TResult>(
            string method,
            Uri uri,
            string refer      = null,
            object data       = null,
            TResult result    = default(TResult),
            string saveToFile = null,
            EventHandler <ResponseStreamContent.RequireProcessStreamEventArgs> streamInvoker = null,
            bool async = false,
            bool?isXhr = null,
            Dictionary <string, object> contextData = null,
            WebHeaderCollection headers             = null,
            ContentType?contentType = null,
            bool?allowAutoRedirect  = null,
            Stream targetStream     = null,
            ExtraRequestInfo extra  = null
            ) where TResult : class
        {
            if (string.IsNullOrEmpty(method))
            {
                throw new ArgumentException($"{nameof(method)} is null or empty.", nameof(method));
            }
            if (uri == null)
            {
                throw new ArgumentNullException(nameof(uri), $"{nameof(uri)} is null.");
            }

            if (typeof(TResult) == typeof(object))
            {
                throw new InvalidOperationException("context type cannot be object.");
            }

            contextData = contextData ?? new Dictionary <string, object>();
            method      = method.ToUpper();

            var resultType = typeof(TResult);

            if (streamInvoker != null && typeof(Stream) == resultType)
            {
                throw new InvalidOperationException("非流结果时不可设置流操作");
            }

            var referUri = Setting.ResolveReferUri ? ResolveUri(HttpRequestHeader.Referer, refer, contextData) : null;
            var request  = new HttpRequestMessage(uri, method)
            {
                Referer = referUri?.OriginalString ?? refer
            };

            if (data != null)
            {
                request.RequestData = WrapRequestContent(data, contentType, extra);
            }
            else if (request.AllowRequestBody)
            {
                request.RequestData = new RequestByteBufferContent(new byte[0]);
            }
            request.Async = async;

            var ctx = HttpHandler.GetContext <TResult>(this, request);

            Setting.InitializeHttpContext(ctx);

            //自动设置格式
            if (request.ExceptType == null)
            {
                request.ExceptType = GetPreferedResponseType(ctx, streamInvoker, result, targetStream, saveToFile);
            }
            request.ExtraRequestInfo = extra;
            if (isXhr != null)
            {
                request.AppendAjaxHeader = isXhr.Value;
            }
            ctx.ContextData = contextData;
            if (headers?.Count > 0)
            {
                if (request.Headers == null)
                {
                    request.Headers = headers;
                }
                else
                {
                    headers.CopyTo(request.Headers);
                }
            }
            request.AllowAutoRedirect = allowAutoRedirect ?? Setting.AllowAutoDirect;

            return(ctx);
        }