Example #1
0
        /// <summary>
        /// 【异步方法】异步从Url下载
        /// </summary>
        /// <param name="url"></param>
        /// <param name="stream"></param>
        /// <returns></returns>
        public static async Task DownloadAsync(string url, Stream stream)
        {
            HttpClient httpClient = OFoodDI.GetRequiredService <SenparcHttpClient>().Client;
            var        data       = await httpClient.GetByteArrayAsync(url).ConfigureAwait(false);

            await stream.WriteAsync(data, 0, data.Length).ConfigureAwait(false);
        }
        /// <summary>
        /// LocalCacheStrategy的构造函数
        /// </summary>
        MemcachedObjectCacheStrategy(/*ILoggerFactory loggerFactory, IOptions<MemcachedClientOptions> optionsAccessor*/)
        {
            _config = GetMemcachedClientConfiguration();
            var            provider      = OFoodDI.GetIServiceProvider();
            ILoggerFactory loggerFactory = provider.GetService <ILoggerFactory>();

            Cache = new MemcachedClient(loggerFactory, _config);
        }
Example #3
0
        /// <summary>
        /// 使用Get方法获取字符串结果(没有加入Cookie)
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static string HttpGet(string url, Encoding encoding = null)
        {
            var handler = HttpClientHelper.GetHttpClientHandler(null, SenparcHttpClientWebProxy, DecompressionMethods.GZip);


            HttpClient httpClient = OFoodDI.GetRequiredService <SenparcHttpClient>().Client;

            return(httpClient.GetStringAsync(url).Result);
        }
Example #4
0
        /// <summary>
        /// 【异步方法】使用Post方法上传数据并下载文件或结果
        /// </summary>
        /// <param name="url"></param>
        /// <param name="data"></param>
        /// <param name="stream"></param>
        public static async Task DownloadAsync(string url, string data, Stream stream)
        {
            HttpClient  httpClient = OFoodDI.GetRequiredService <SenparcHttpClient>().Client;
            HttpContent hc         = new StringContent(data);
            var         ht         = await httpClient.PostAsync(url, hc).ConfigureAwait(false);

            var fileBytes = await ht.Content.ReadAsByteArrayAsync().ConfigureAwait(false);

            await stream.WriteAsync(fileBytes, 0, fileBytes.Length).ConfigureAwait(false);//也可以分段写入
        }
Example #5
0
        /// <summary>
        /// 从Url下载
        /// </summary>
        /// <param name="url"></param>
        /// <param name="stream"></param>
        public static void Download(string url, Stream stream)
        {
            HttpClient httpClient = OFoodDI.GetRequiredService <SenparcHttpClient>().Client;
            var        t          = httpClient.GetByteArrayAsync(url);

            t.Wait();
            var data = t.Result;

            stream.Write(data, 0, data.Length);
        }
Example #6
0
        /// <summary>
        /// 从 HttpClientFactory 的唯一名称中获取 HttpClient 对象,并加载到 SenparcHttpClient 中
        /// </summary>
        /// <param name="httpClientName"></param>
        /// <returns></returns>
        public static SenparcHttpClient GetInstanceByName(string httpClientName)
        {
            if (!string.IsNullOrEmpty(httpClientName))
            {
                var clientFactory = OFoodDI.GetRequiredService <IHttpClientFactory>();
                var httpClient    = clientFactory.CreateClient(httpClientName);
                return(new SenparcHttpClient(httpClient));
            }

            return(OFoodDI.GetRequiredService <SenparcHttpClient>(true));
        }
Example #7
0
        /// <summary>
        /// 使用Get方法获取字符串结果(没有加入Cookie)
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public static async Task <string> HttpGetAsync(string url, Encoding encoding = null)
        {
            var handler = new HttpClientHandler
            {
                UseProxy = SenparcHttpClientWebProxy != null,
                Proxy    = SenparcHttpClientWebProxy,
            };

            HttpClient httpClient = OFoodDI.GetRequiredService <SenparcHttpClient>().Client;

            return(await httpClient.GetStringAsync(url).ConfigureAwait(false));
        }
        private static MemcachedClientConfiguration GetMemcachedClientConfiguration(/*ILoggerFactory loggerFactory, IOptions<MemcachedClientOptions> optionsAccessor*/)

        {
            //每次都要新建

            var            provider      = OFoodDI.GetIServiceProvider();
            ILoggerFactory loggerFactory = provider.GetService <ILoggerFactory>();
            IOptions <MemcachedClientOptions> optionsAccessor = provider.GetService <IOptions <MemcachedClientOptions> >();

            var config = new MemcachedClientConfiguration(loggerFactory, optionsAccessor);

            return(config);
        }
Example #9
0
        /// <summary>
        /// 使用Post方法上传数据并下载文件或结果
        /// </summary>
        /// <param name="url"></param>
        /// <param name="data"></param>
        /// <param name="stream"></param>
        public static void Download(string url, string data, Stream stream)
        {
            HttpClient  httpClient = OFoodDI.GetRequiredService <SenparcHttpClient>().Client;
            HttpContent hc         = new StringContent(data);
            var         ht         = httpClient.PostAsync(url, hc);

            ht.Wait();
            var ft = ht.Result.Content.ReadAsByteArrayAsync();

            ft.Wait();
            var file = ft.Result;

            stream.Write(file, 0, file.Length);
        }
Example #10
0
        /// <summary>
        /// .NET Core 版本的HttpWebRequest参数设置
        /// </summary>
        /// <returns></returns>
        private static HttpClient HttpGet_Common_NetCore(string url, CookieContainer cookieContainer = null,
                                                         Encoding encoding = null, X509Certificate2 cer = null,
                                                         string refererUrl = null, bool useAjax         = false, int timeOut = OFoodConfig.TIME_OUT)
        {
            var handler = HttpClientHelper.GetHttpClientHandler(cookieContainer, RequestUtility.SenparcHttpClientWebProxy, DecompressionMethods.GZip);

            if (cer != null)
            {
                handler.ClientCertificates.Add(cer);
            }

            HttpClient httpClient = OFoodDI.GetRequiredService <SenparcHttpClient>().Client;

            HttpClientHeader(httpClient, refererUrl, useAjax, null, timeOut);

            return(httpClient);
        }
Example #11
0
        /// <summary>
        /// 注册 IServiceCollection,并返回 RegisterService,开始注册流程(必须)
        /// </summary>
        /// <param name="serviceCollection">IServiceCollection</param>
        /// <param name="certName">证书名称,必须全局唯一,并且确保在全局 HttpClientFactory 内唯一</param>
        /// <param name="cert">证书对象,也可以是 X509Certificate2</param>
        /// <param name="checkValidationResult">设置</param>
        /// <returns></returns>
        public static IServiceCollection AddSenparcHttpClientWithCertificate(this IServiceCollection serviceCollection,
                                                                             string certName, X509Certificate cert, bool checkValidationResult = false)
        {
            serviceCollection.AddHttpClient <SenparcHttpClient>(certName)
            .ConfigurePrimaryHttpMessageHandler(() =>
            {
                var httpClientHandler = HttpClientHelper.GetHttpClientHandler(null, RequestUtility.SenparcHttpClientWebProxy, System.Net.DecompressionMethods.GZip);

                httpClientHandler.ClientCertificates.Add(cert);

                if (checkValidationResult)
                {
                    httpClientHandler.ServerCertificateCustomValidationCallback = new Func <HttpRequestMessage, X509Certificate2, X509Chain, SslPolicyErrors, bool>(RequestUtility.CheckValidationResult);
                }

                return(httpClientHandler);
            });

            OFoodDI.ResetGlobalIServiceProvider();//重置 GlobalIServiceProvider
            return(serviceCollection);
        }
Example #12
0
        /// <summary>
        /// 【异步方法】从Url下载,并保存到指定目录
        /// </summary>
        /// <param name="url">需要下载文件的Url</param>
        /// <param name="filePathName">保存文件的路径,如果下载文件包含文件名,按照文件名储存,否则将分配Ticks随机文件名</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns></returns>
        public static async Task <string> DownloadAsync(string url, string filePathName, int timeOut = OFoodConfig.TIME_OUT)
        {
            var dir = Path.GetDirectoryName(filePathName) ?? "/";

            Directory.CreateDirectory(dir);

            System.Net.Http.HttpClient httpClient = OFoodDI.GetRequiredService <SenparcHttpClient>().Client;
            httpClient.Timeout = TimeSpan.FromMilliseconds(timeOut);
            using (var responseMessage = await httpClient.GetAsync(url).ConfigureAwait(false))
            {
                if (responseMessage.StatusCode == HttpStatusCode.OK)
                {
                    string responseFileName = null;
                    //ContentDisposition可能会为Null
                    if (responseMessage.Content.Headers.ContentDisposition != null &&
                        responseMessage.Content.Headers.ContentDisposition.FileName != null &&
                        responseMessage.Content.Headers.ContentDisposition.FileName != "\"\"")
                    {
                        responseFileName = Path.Combine(dir, responseMessage.Content.Headers.ContentDisposition.FileName.Trim('"'));
                    }

                    var fullName = responseFileName ?? Path.Combine(dir, GetRandomFileName());
                    using (var fs = File.Open(fullName, FileMode.Create))
                    {
                        using (var responseStream = await responseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false))
                        {
                            await responseStream.CopyToAsync(fs).ConfigureAwait(false);

                            await fs.FlushAsync().ConfigureAwait(false);
                        }
                    }
                    return(fullName);
                }
                else
                {
                    return(null);
                }
            }
        }
Example #13
0
        //#if !NET35 && !NET40
        /// <summary>
        /// 从Url下载,并保存到指定目录
        /// </summary>
        /// <param name="url">需要下载文件的Url</param>
        /// <param name="filePathName">保存文件的路径,如果下载文件包含文件名,按照文件名储存,否则将分配Ticks随机文件名</param>
        /// <param name="timeOut">超时时间</param>
        /// <returns></returns>
        public static string Download(string url, string filePathName, int timeOut = 999)
        {
            var dir = Path.GetDirectoryName(filePathName) ?? "/";

            Directory.CreateDirectory(dir);

            System.Net.Http.HttpClient httpClient = OFoodDI.GetRequiredService <SenparcHttpClient>().Client;
            using (var responseMessage = httpClient.GetAsync(url).Result)
            {
                if (responseMessage.StatusCode == HttpStatusCode.OK)
                {
                    string responseFileName = null;
                    //ContentDisposition可能会为Null
                    if (responseMessage.Content.Headers.ContentDisposition != null &&
                        responseMessage.Content.Headers.ContentDisposition.FileName != null &&
                        responseMessage.Content.Headers.ContentDisposition.FileName != "\"\"")
                    {
                        responseFileName = Path.Combine(dir, responseMessage.Content.Headers.ContentDisposition.FileName.Trim('"'));
                    }

                    var fullName = responseFileName ?? Path.Combine(dir, GetRandomFileName());
                    using (var fs = File.Open(fullName, FileMode.Create))
                    {
                        using (var responseStream = responseMessage.Content.ReadAsStreamAsync().Result)
                        {
                            responseStream.CopyTo(fs);
                            fs.Flush();
                        }
                    }
                    return(fullName);
                }
                else
                {
                    return(null);
                }
            }
        }
Example #14
0
        /// <summary>
        /// 获取页面提交的get和post参数
        /// 注意:.NetCore环境必须传入HttpContext实例,不能传Null,这个接口调试特别困难,千万别出错!
        /// </summary>
        /// <param name="httpContext"></param>
        public ResponseHandler(HttpContext httpContext)
        {
#if NET35 || NET40 || NET45 || NET461
            Parameters = new Hashtable();

            this.HttpContext = httpContext ?? HttpContext.Current;
            NameValueCollection collection;
            //post data
            if (this.HttpContext.Request.HttpMethod == "POST")
            {
                collection = this.HttpContext.Request.Form;
                foreach (string k in collection)
                {
                    string v = (string)collection[k];
                    this.SetParameter(k, v);
                }
            }
            //query string
            collection = this.HttpContext.Request.QueryString;
            foreach (string k in collection)
            {
                string v = (string)collection[k];
                this.SetParameter(k, v);
            }
            if (this.HttpContext.Request.InputStream.Length > 0)
            {
                XmlDocument xmlDoc = new Senparc.CO2NET.ExtensionEntities.XmlDocument_XxeFixed();
                xmlDoc.XmlResolver = null;
                xmlDoc.Load(this.HttpContext.Request.InputStream);
                XmlNode     root = xmlDoc.SelectSingleNode("xml");
                XmlNodeList xnl  = root.ChildNodes;

                foreach (XmlNode xnf in xnl)
                {
                    this.SetParameter(xnf.Name, xnf.InnerText);
                }
            }
#else
            Parameters = new Hashtable();

            //#if NETSTANDARD2_0
            //            HttpContext = httpContext ?? throw new WeixinException(".net standard 2.0 环境必须传入HttpContext的实例");
            //#else
            HttpContext = httpContext ?? OFoodDI.GetService <IHttpContextAccessor>()?.HttpContext;
            //#endif

            //post data
            if (HttpContext.Request.Method.ToUpper() == "POST" && HttpContext.Request.HasFormContentType)
            {
                foreach (var k in HttpContext.Request.Form)
                {
                    SetParameter(k.Key, k.Value[0]);
                }
            }
            //query string
            foreach (var k in HttpContext.Request.Query)
            {
                SetParameter(k.Key, k.Value[0]);
            }
            if (HttpContext.Request.ContentLength > 0)
            {
                var xmlDoc = new XmlDocument_XxeFixed();
                xmlDoc.XmlResolver = null;
                //xmlDoc.Load(HttpContext.Request.Body);
                using (var reader = new System.IO.StreamReader(HttpContext.Request.Body))
                {
                    xmlDoc.Load(reader);
                }
                var root = xmlDoc.SelectSingleNode("xml");

                foreach (XmlNode xnf in root.ChildNodes)
                {
                    SetParameter(xnf.Name, xnf.InnerText);
                }
            }
#endif
        }