Пример #1
0
        public void NamedFileStreamConstructorTest()
        {
            string name = "name";
            string filename = "test.jpg";
            string contentType = "image/jpeg";
            Stream stream = new MemoryStream();
            NamedFileStream target = new NamedFileStream(name, filename, contentType, stream);

            Assert.AreEqual(name, target.Name);
            Assert.AreEqual(filename, target.Filename);
            Assert.AreEqual(stream, target.Stream);
            Assert.AreEqual(contentType, target.ContentType);
        }
Пример #2
0
        public RequestBuilder Upload(NamedFileStream[] files, object parameters, Action<long,long?> onProgressChanged, Action<long> onUploadComplete)
        {
            MultipartBodyProvider bodyProvider = new MultipartBodyProvider();
            bodyProvider.OnCompletedCallback = onUploadComplete;
            bodyProvider.OnProgressChangeCallback = onProgressChanged;
            foreach (NamedFileStream file in files)
            {
                bodyProvider.AddFile(file);
            }

            bodyProvider.SetParameters(parameters);
            return this.Body(bodyProvider);
        }
Пример #3
0
        public void NamedFileStreamConstructorTest()
        {
            var name        = "name";
            var filename    = "test.jpg";
            var contentType = "image/jpeg";
            var stream      = new MemoryStream();
            var target      = new NamedFileStream(name, filename, contentType, stream);

            Assert.AreEqual(name, target.Name);
            Assert.AreEqual(filename, target.Filename);
            Assert.AreEqual(stream, target.Stream);
            Assert.AreEqual(contentType, target.ContentType);
        }
 public void AddFile(NamedFileStream file)
 {
     files.Add(file);
 }
Пример #5
0
 public RequestBuilder Upload(NamedFileStream[] files, Action<long, long?> onProgressChanged)
 {
     return this.Upload(files, new { }, onProgressChanged, a => { });
 }
Пример #6
0
 public RequestBuilder Upload(NamedFileStream[] files)
 {
     return this.Upload(files, new { });
 }
Пример #7
0
 public RequestBuilder Upload(NamedFileStream[] files, object parameters)
 {
     return this.Upload(files, parameters,(a,b)=> { }, a=>{ });
 }
Пример #8
0
 public void SetUp()
 {
     stream = new MemoryStream();
     fs     = new NamedFileStream("n", "fn", "ct", stream);
 }
Пример #9
0
 public void SetUp()
 {
     stream = new MemoryStream();
     fs = new NamedFileStream("n", "fn", "ct", stream);
 }
Пример #10
0
 /// <summary>
 /// 异步上传文件
 /// </summary>
 /// <param name="url">url地址</param>
 /// <param name="files">文件信息</param>
 /// <param name="parameters">请求参数</param>
 /// <param name="method">请求方法</param>
 /// <param name="contentType">contentType</param>
 /// <param name="header">header</param>
 /// <returns>Task</returns>
 public static Task<HttpResult> UploadTask(string url, NamedFileStream[] files, object parameters = null, HttpVerb method = HttpVerb.Post, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null)
 {
     var cts = new TaskCompletionSource<HttpResult>();
     Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, files, (result) =>
     {
         if (result.IsFaulted)
             cts.SetException(result.Exception);
         else if (result.IsCanceled)
             cts.SetCanceled();
         else if (result.IsCompleted)
             cts.SetResult(result);
     });
     return cts.Task;
 }
Пример #11
0
 /// <summary>
 /// 异步上传文件
 /// </summary>
 /// <param name="url">url地址</param>
 /// <param name="files">文件信息</param>
 /// <param name="callback">回调函数</param>
 /// <param name="parameters">请求参数</param>
 /// <param name="method">请求方法</param>
 /// <param name="contentType">contentType</param>
 /// <param name="header">header</param>
 public static void Upload(string url, NamedFileStream[] files, Action<byte[]> callback, object parameters = null, HttpVerb method = HttpVerb.Post, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null)
 {
     Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, files, StreamToBytesCallback(callback));
 }
Пример #12
0
        /// <summary>
        /// Http异步请求发送
        /// </summary>
        /// <param name="httpParam">请求参数</param>
        /// <param name="files">文件上传的信息</param>
        /// <param name="callback">返回请求响应结果回调</param>
        public static void Request(HttpParam httpParam, NamedFileStream[] files, Action<HttpResult> callback)
        {
            if (httpParam == null) {
                throw new ArgumentException("httpParam not null");
            }

            if (httpParam.Method != HttpVerb.Post && httpParam.Method != HttpVerb.Put) {
                throw new ArgumentException("Request method must be POST or PUT");
            }

            if (string.IsNullOrWhiteSpace(httpParam.URL)) {
                throw new ArgumentException("url not null");
            }

            //使用回调的方法进行证书验证。
            if (httpParam.RemoteCertificateValidationCallback != null)
                ServicePointManager.ServerCertificateValidationCallback = httpParam.RemoteCertificateValidationCallback;

            Encoding encoding = DefaultEncoding;

            if (httpParam.Encoding != null)
                encoding = httpParam.Encoding;

            if (files.Length == 0)
                throw new ArgumentException("files is empty");

            HttpWebRequest request = null;

            //设置分界线
            string boundary = RandomString(12);

            try {
                request = (HttpWebRequest)HttpWebRequest.Create(new Uri(httpParam.URL));

                SetRequest(request, httpParam);

                request.ContentType = "multipart/form-data; boundary=" + boundary;

                //开始异步请求
                request.BeginGetRequestStream(new AsyncCallback((callbackResult) =>
                {
                    HttpWebRequest _request = (HttpWebRequest)callbackResult.AsyncState;

                    var requestStream = _request.EndGetRequestStream(callbackResult);

                    //转化网络流对象进行直接射入,省内存
                    using (StreamWriter writer = new StreamWriter(requestStream, encoding)) {
                        try {
                            IDictionary postbody = SerializeQuery(httpParam.Parameters);

                            string newLine = "\r\n";

                            //处理form-data
                            if (postbody != null) {
                                foreach (string key in postbody.Keys) {
                                    if (postbody[key] != null) {
                                        writer.Write("--" + boundary + newLine);
                                        writer.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}", key, newLine);
                                        writer.Write(postbody[key] + newLine);
                                        writer.Flush();
                                    }
                                }
                            }

                            //处理文件流
                            foreach (var file in files) {
                                writer.Write("--" + boundary + newLine);
                                writer.Write(
                                    "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}",
                                    file.Name,
                                    file.FileName,
                                    newLine
                                    );
                                writer.Write("Content-Type: application/octet-stream" + newLine + newLine);
                                writer.Flush();

                                //复制文件流到Body
                                CopyStream(file.Stream, requestStream);

                                writer.Write(newLine);
                                writer.Write("--" + boundary + newLine);
                                writer.Flush();
                            }
                        } catch (Exception ex) {
                            requestStream.Dispose();
                            ProcessFailCallback(callback, ex);
                            return;
                        } finally {
                            //使用完后释放
                            foreach (var file in files)
                                if (file.Stream != null)
                                    file.Stream.Dispose();
                        }
                    }

                    //异步接收响应,并且设置一个超时时间
                    IAsyncResult asyncResult = _request.BeginGetResponse(null, _request);
                    asyncResult.FromAsync((ia, isTimeout) =>
                    {
                        if (isTimeout) {
                            ProcessFailCallback(callback, new TimeoutException("Connection Timeout"));
                        } else {
                            ProcessCallback(ia, callback);
                        }
                    }, httpParam.Timeout);

                }), request);
            } catch (WebException exception) {
                //遇到异常时候再次释放一次,防止内存泄漏
                foreach (var file in files)
                    if (file.Stream != null)
                        file.Stream.Dispose();
                if (request != null)
                    request.Abort();
                ProcessFailCallback(callback, exception);
            }
        }
Пример #13
0
 /// <summary>
 /// Http异步请求发送
 /// </summary>
 /// <param name="httpParam">请求参数</param>
 /// <param name="files">文件上传的信息</param>
 /// <param name="callback">返回请求响应结果回调</param>
 /// <param name="userState">状态</param>
 public static void Request(HttpParam httpParam, NamedFileStream[] files, Action<HttpResult, object> callback, object userState)
 {
     Request(httpParam, files, (result) => callback(result, userState));
 }
Пример #14
0
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="url">url地址</param>
        /// <param name="files">文件信息</param>
        /// <param name="parameters">请求参数</param>
        /// <param name="method">请求方法</param>
        /// <param name="contentType">contentType</param>
        /// <param name="header">WebHeaderCollection</param>
        /// <returns>return string</returns>
        public static string UploadToString(string url, NamedFileStream[] files, object parameters = null, HttpVerb method = HttpVerb.Post, string contentType = "application/x-www-form-urlencoded", WebHeaderCollection header = null)
        {
            var result = Request(new HttpParam { URL = url, Parameters = parameters, Method = method, ContentType = contentType, Header = header }, files);

            return result.ToStringResult();
        }
Пример #15
0
        /// <summary>
        /// Http请求发送文件
        /// </summary>
        /// <param name="httpParam">请求参数</param>
        /// <param name="files">文件上传的信息</param>
        /// <returns>返回请求响应结果</returns>
        public static HttpResult Request(HttpParam httpParam, NamedFileStream[] files)
        {
            if (httpParam == null) {
                throw new ArgumentException("httpParam not null");
            }

            if (httpParam.Method != HttpVerb.Post && httpParam.Method != HttpVerb.Put) {
                throw new ArgumentException("Request method must be POST or PUT");
            }

            if (string.IsNullOrWhiteSpace(httpParam.URL)) {
                throw new ArgumentException("url not null");
            }

            //使用回调的方法进行证书验证。
            if (httpParam.RemoteCertificateValidationCallback != null)
                ServicePointManager.ServerCertificateValidationCallback = httpParam.RemoteCertificateValidationCallback;

            Encoding encoding = DefaultEncoding;

            if (httpParam.Encoding != null)
                encoding = httpParam.Encoding;

            if (files.Length == 0)
                throw new ArgumentException("files is empty");

            HttpWebRequest request = null;

            //设置分界线
            string boundary = RandomString(12);

            try {
                request = (HttpWebRequest)HttpWebRequest.Create(new Uri(httpParam.URL));

                SetRequest(request, httpParam);

                request.ContentType = "multipart/form-data; boundary=" + boundary;

                var requestStream = request.GetRequestStream();

                //转化网络流对象进行直接射入,省内存
                using (StreamWriter writer = new StreamWriter(requestStream, encoding)) {
                    try {
                        IDictionary postbody = SerializeQuery(httpParam.Parameters);

                        string newLine = "\r\n";

                        //处理form-data
                        if (postbody != null) {
                            foreach (string key in postbody.Keys) {
                                if (postbody[key] != null) {
                                    writer.Write("--" + boundary + newLine);
                                    writer.Write("Content-Disposition: form-data; name=\"{0}\"{1}{1}", key, newLine);
                                    writer.Write(postbody[key] + newLine);
                                    writer.Flush();
                                }
                            }
                        }

                        //处理文件
                        foreach (var file in files) {
                            writer.Write("--" + boundary + newLine);
                            writer.Write(
                                "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}",
                                file.Name,
                                file.FileName,
                                newLine
                                );
                            writer.Write("Content-Type: application/octet-stream" + newLine + newLine);
                            writer.Flush();

                            //复制文件流到Body
                            CopyStream(file.Stream, requestStream);

                            writer.Write(newLine);
                            writer.Write("--" + boundary + newLine);
                            writer.Flush();
                        }
                    } catch (Exception ex) {
                        requestStream.Dispose();
                        //LogContext.GetLogger<HttpRequest>().Error(ex.Message, ex);
                        return new HttpResult { Exception = ex, IsFaulted = true };
                    } finally {
                        //使用完后释放
                        foreach (var file in files) {
                            if (file.Stream != null)
                                file.Stream.Dispose();
                        }
                    }
                }

                return Process((HttpWebResponse)request.GetResponse());
            } catch (WebException exception) {
                if (request != null)
                    request.Abort();
                //遇到异常时候再次释放一次,防止内存泄漏
                foreach (var file in files) {
                    if (file.Stream != null)
                        file.Stream.Dispose();
                }
                //LogContext.GetLogger<HttpRequest>().Error(exception.Message, exception);
                return new HttpResult { Exception = exception, IsFaulted = true };
            }
        }