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); }
/// <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); }