Exemple #1
0
        /// <summary>
        /// 创建网络请求
        /// </summary>
        /// <param name="uri">请求地址</param>
        /// <param name="method">方法</param>
        /// <param name="requestData">写入的数据</param>
        /// <param name="refer">引用页</param>
        /// <param name="messageCallback">消息处理句柄</param>
        /// <param name="saveToFile">保存文件地址</param>
        /// <param name="streamInvoker">流读取对象,仅当返回结果为流时可用</param>
        /// <typeparam name="TResult">结果类型</typeparam>
        /// <returns></returns>
        public HttpContext <TResult> Create <TResult>(Uri uri, HttpMethod?method = null, object requestData = null, Uri refer = null,
                                                      Action <HttpRequestMessage> messageCallback = null, string saveToFile = null, Action <Stream> streamInvoker = null, bool async = false)
        {
            var resultType = typeof(TResult);

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


            var request = new HttpRequestMessage(uri, method.Value)
            {
                ReferUri = refer,
                Encoding = Setting.StringEncoding
            };

            if (requestData != null)
            {
                if (requestData is HttpRequestContent)
                {
                    request.RequestData = requestData as HttpRequestContent;
                }
                else if (requestData is string)
                {
                    request.RequestData = new RequestStringContent(requestData as string);
                }
                else if (requestData is Stream)
                {
                    request.RequestData = new RequestCopyStreamContent(requestData as Stream);
                }
                else if (requestData is byte[])
                {
                    request.RequestData = new RequestByteBufferContent(requestData as byte[]);
                }
                else if (requestData is IDictionary <string, string> )
                {
                    request.RequestData = new RequestFormDataContent(requestData as IDictionary <string, string>);
                }
                else
                {
                    request.RequestData = new RequestObjectContent <object>(requestData);
                }
            }
            else if (method == HttpMethod.POST)
            {
                request.RequestData = new RequestByteBufferContent(new byte[0]);
            }
            request.Async = async;

            if (messageCallback != null)
            {
                messageCallback(request);
            }

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

            //自动设置格式
            if (request.ExceptType == null)
            {
                if (!saveToFile.IsNullOrEmpty())
                {
                    request.ExceptType = new ResponseFileContent(ctx, this, saveToFile);
                }
                else
                {
                    if (resultType != typeof(object))
                    {
                        if (resultType == typeof(string))
                        {
                            request.ExceptType = new ResponseStringContent(ctx, this);
                        }
                        else if (resultType == typeof(byte[]))
                        {
                            request.ExceptType = new ResponseBinaryContent(ctx, this);
                        }
                        else if (resultType == typeof(Image))
                        {
                            request.ExceptType = new ResponseImageContent(ctx, this);
                        }
                        else if (resultType == typeof(XmlDocument))
                        {
                            request.ExceptType = new ResponseXmlContent(ctx, this);
                        }
                        else if (resultType == typeof(Stream))
                        {
                            var r = new ResponseStreamContent(ctx, this);
                            request.ExceptType = r;
                            if (streamInvoker != null)
                            {
                                r.RequireProcessStream += (s, e) => streamInvoker(e.Stream);
                            }
                        }
                        else
                        {
                            request.ExceptType = new ResponseObjectContent <TResult>(ctx, this);
                        }
                    }
                }
            }

            return(ctx);
        }
 /// <summary>
 /// 绑定上下文环境
 /// </summary>
 /// <param name="message"></param>
 public virtual void BindContext(HttpClient client, HttpContext context, HttpRequestMessage message)
 {
     Client = client;
     Context = context;
     Message = message;
 }