private async void btn_userLogin_Click(object sender, EventArgs e)
        {
            UInfo = new UserInfo();

            UInfo.UserName = "HelloLLLLL";
            UInfo.UserPwd = "123456";

            Dictionary<string, string> dicP = new Dictionary<string, string>();
            
            dicP.Add("UserName", UInfo.UserName);
            dicP.Add("UserPwd", UInfo.UserPwd);

            Task<WebResponse> reqPOST = null;

            WebResponse Res = null;
            try
            {
                reqPOST = HttpHelper.HttpRequestAsync("POST", _url + "User/GetUserLogin", null,
                  dicP, Encoding.UTF8,
                  "application/x-www-form-urlencoded;charset=utf-8");
                await reqPOST;

                Res = reqPOST.Result;

            }
            catch (WebException ex)
            {
                Res = (HttpWebResponse)ex.Response;

                if (Res == null)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }

               
            }
            catch (Exception e1)
            {
                MessageBox.Show(e1.Message);
                return;
            }

            System.IO.StreamReader readerPOST;
            readerPOST = new System.IO.StreamReader(Res.GetResponseStream(), Encoding.UTF8);
            var retJson = readerPOST.ReadToEnd(); //得到响应结果
            readerPOST.Close();
            Res.Close();

            txt_msg.Text = retJson;

            var rd = JsonConvert.DeserializeObject<ResultData<UserInfo>>(retJson);
            UInfo =  rd.Data ;
            this.DialogResult = DialogResult.OK;
        }

//helper

#define TEST
//#undef TEST
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using System.Web; namespace SocketUtil
{
public static class HttpHelper
{
//http://localhost:3322/
// http://localhost:63483/
#if TEST
public static string ApiUrl = "http://localhost:63483/actionapi/";
#else
public static string ApiUrl = "http://localhost:3322/actionapi/";
#endif
/// <summary>
/// http/https请求响应
/// </summary>
/// <param name="getOrPost"></param>
/// <param name="url">地址(要带上http或https)</param>
/// <param name="headers">请求头</param>
/// <param name="parameters">提交数据</param>
/// <param name="dataEncoding">编码类型 utf-8</param>
/// <param name="contentType">application/x-www-form-urlencoded</param>
/// <returns></returns>
public static Task<WebResponse> HttpRequestAsync(
string getOrPost,
string url,
Dictionary<string, string> headers,
Dictionary<string, string> parameters,
Encoding dataEncoding,
string contentType
)
{
HttpWebRequest request = null;
Task<WebResponse> task = null; request = CreateRequest(getOrPost, url, headers, parameters, dataEncoding, contentType); //如果需要POST数据
if (getOrPost == "POST" && !(parameters == null || parameters.Count == 0))
{
var data = FormatPostParameters(parameters, dataEncoding, contentType);
Stream stream = null;
//这里需要捕获 计算机拒绝的异常
try
{ stream = request.GetRequestStream();
}
catch (Exception ex)
{ request.Abort();
request = null;
throw;
}
if (stream != null)
{
stream.Write(data, 0, data.Length);
stream.Close();
} } task = request.GetResponseAsync(); return task; //if (null == Res)
//{
// return request.GetResponse() as HttpWebResponse;
//} //return (HttpWebResponse)Res;
} /// <summary>
/// 创建HTTP请求对象
/// </summary>
/// <param name="getOrPost"></param>
/// <param name="url"></param>
/// <param name="headers"></param>
/// <param name="parameters"></param>
/// <param name="paraEncoding"></param>
/// <param name="contentType"></param>
/// <returns></returns>
private static HttpWebRequest CreateRequest(
string getOrPost
, string url
, Dictionary<string, string> headers
, Dictionary<string, string> parameters
, Encoding paraEncoding
, string contentType
)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
} if (parameters != null && parameters.Count > 0 && paraEncoding == null)
{
throw new ArgumentNullException("requestEncoding");
} HttpWebRequest request = null;
if (getOrPost == "GET")
{ if (parameters != null && parameters.Count > 0)
{
url = FormatGetParametersToUrl(url, parameters, paraEncoding);
}
} //判断是否是https
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{ request = WebRequest.Create(url) as HttpWebRequest; } if (getOrPost == "GET")
{
request.Method = "GET"; }
else
{
request.Method = "POST";
} if (contentType == null)
{
request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
}
else
{
request.ContentType = contentType;
} //POST的数据大于1024字节的时候,如果不设置会分两步
request.ServicePoint.Expect100Continue = false;
request.ServicePoint.ConnectionLimit = int.MaxValue; if (headers != null)
{
FormatRequestHeaders(headers, request);
} return request;
} /// <summary>
/// 格式化请求头信息
/// </summary>
/// <param name="headers"></param>
/// <param name="request"></param>
private static void FormatRequestHeaders(Dictionary<string, string> headers, HttpWebRequest request)
{
foreach (var hd in headers)
{
//因为HttpWebRequest中很多标准标头都被封装成只能通过属性设置,添加的话会抛出异常
switch (hd.Key.ToLower())
{
case "connection":
request.KeepAlive = false;
break;
case "content-type":
request.ContentType = hd.Value;
break;
case "transfer-enconding":
request.TransferEncoding = hd.Value;
break;
default:
request.Headers.Add(hd.Key, hd.Value);
break;
}
}
} /// <summary>
/// 格式化Get请求参数
/// </summary>
/// <param name="url">URL</param>
/// <param name="parameters">参数</param>
/// <param name="paraEncoding">编码格式</param>
/// <returns></returns> private static string FormatGetParametersToUrl(string url, Dictionary<string, string> parameters, Encoding paraEncoding)
{
if (url.IndexOf("?") < 0)
url += "?";
int i = 0;
string sendContext = "";
foreach (var parameter in parameters)
{
if (i > 0)
{
sendContext += "&";
} sendContext += HttpUtility.UrlEncode(parameter.Key, paraEncoding)
+ "=" + HttpUtility.UrlEncode(parameter.Value, paraEncoding);
++i;
} url += sendContext;
return url;
} /// <summary>
/// 格式化Post请求参数
/// </summary>
/// <param name="parameters">编码格式</param>
/// <param name="dataEncoding">编码格式</param>
/// <param name="contentType">类型</param>
/// <returns></returns>
private static byte[] FormatPostParameters(Dictionary<string, string> parameters, Encoding dataEncoding, string contentType)
{
string sendContext = "";
int i = 0;
if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json")
{
sendContext = "{";
} foreach (var para in parameters)
{
if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json")
{
if (i > 0)
{
if (para.Value.StartsWith("{"))
{
sendContext += string.Format(@",""{0}"":{1}", para.Key, para.Value);
}
else
{
sendContext += string.Format(@",""{0}"":""{1}""", para.Key, para.Value);
} }
else
{
if (para.Value.StartsWith("{"))
{
sendContext += string.Format(@"""{0}"":{1}", para.Key, para.Value);
}
else
{
sendContext += string.Format(@"""{0}"":""{1}""", para.Key, para.Value);
} }
}
else
{
if (i > 0)
{
sendContext += string.Format("&{0}={1}", para.Key, HttpUtility.UrlEncode(para.Value, dataEncoding));
}
else
{
sendContext = string.Format("{0}={1}", para.Key, HttpUtility.UrlEncode(para.Value, dataEncoding));
}
} i++;
} if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json")
{
sendContext += "}";
} byte[] data = dataEncoding.GetBytes(sendContext);
return data;
} private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain,
SslPolicyErrors errors)
{
return true; //总是接受
}
}
}

//是参考的:https://blog.csdn.net/sinat_16998945/article/details/84071384

不过他这个有bug,当为GET请求时,url参数不能被拼接。他下面评论区指出了的。

【C#】 封装的异步HttpRequest的更多相关文章

  1. ajax二次封装之异步加载

    ajax二次封装之异步加载 ajax异步加载会导致在数据未加载回来就读取数据,然后出现数据为空的报错.在ajax封装时,将ajax直接改为同步,虽然可以解决报错,但是会导致页面渲染被阻塞,接口反应时间 ...

  2. 基于layer封装的异步加载分部视图弹出层

    背景:之前一直用的artdialog,但是样式不是很好看,后来偶然看到layer,觉得不错,但是对于.net mvc来说,不能像artdialog一样弹出分部视图是很难受的.所以下面的方法就解决了. ...

  3. winform 开发中 把耗时操作 封装起来 异步执行(.net 4.0)

    .先定义一个 BackgroundTask.cs 代码如下: public class BackgroundTask { private static WaitDialogForm LoadingDl ...

  4. C#Web异步操作封装

    using System; using System.Collections.Generic; using System.Web; namespace HttpAsync { /// <summ ...

  5. 爬虫之多线程 多进程 自定义异步IO框架

    什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...

  6. [.NET] 利用 async & await 的异步编程

    利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异 ...

  7. 高性能的关键:Spring MVC的异步模式

    我承认有些标题党了,不过话说这样其实也没错,关于“异步”处理的文章已经不少,代码例子也能找到很多,但我还是打算发表这篇我写了好长一段时间,却一直没发表的文章,以一个更简单的视角,把异步模式讲清楚. 什 ...

  8. Task异步编程

    Task异步编程中,可以实现在等待耗时任务的同时,执行不依赖于该耗时任务结果的其他同步任务,提高效率. 1.Task异步编程方法签名及返回值: a) 签名有async 修饰符 b) 方法名以 Asyn ...

  9. 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...

  10. 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]

    看到Microsoft官方一篇关于异步编程的文章,感觉挺好,不敢独享,分享给大家. 原文地址:https://msdn.microsoft.com/zh-cn/library/hh191443.asp ...

随机推荐

  1. 如何通过 kubectl 进入 node shell

    概述 假设这样一个场景: 生产环境中,Node 都需要通过堡垒机登录,但是 kubectl 是可以直接在个人电脑上登录的. 这种场景下,我想要通过 kubectl 登录到 K8S 集群里的 Node, ...

  2. nginx重新整理——————开篇[一]

    前言 因为整理http协议,顺便把nginx 整理了. 正文 主要作用: 正向代理 反向代理(负载均衡.缓存等) 静态资源 nginx 的优点: 适合高并发,一个进程可以处理很多的请求. 扩展性强,有 ...

  3. redis 简单整理——内存的优化[二十七]

    前言 简单介绍一下内存的优化. 正文 Redis所有的数据都在内存中,而内存又是非常宝贵的资源.如何优化内存的使用一直是Redis用户非常关注的问题.本节深入到Redis细节中,探索内存优化的技巧. ...

  4. 什么是ip协议二

    前言 续前面一章. 正文 看下ip选项: 看一张图: 这个ip选项一般我们不用看,即使你去搞硬件,那么做c++或者c的人会告诉你填啥,按照他们设置即可. 那么ip是如何传输的呢? 先看这张图,这张图的 ...

  5. boltdb 介绍

    介绍 BoltDB 是一个用 Go 语言编写的嵌入式键/值数据库.以下是关于 BoltDB 的一些基本介绍: 键/值存储: BoltDB 为应用程序提供了简单的键/值存储接口. 事务: BoltDB ...

  6. dbeaver导出结果集中乱码

    重要的一步 需要点击

  7. 搭建Hadoop环境

    搭建Hadoop环境 一.虚拟机的安装 二. 安装JDK 1.下载jdk wget https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41- ...

  8. 开源小白到核心开发——我与 sealer 的成长故事

    简介: 下面将以作者本人与 sealer 的一段成长故事来带领大家体验从小白到核心功能开发者的开源之旅,同时本文也作为一篇引领开源小白入门的文章供大家参考. 作者:周欣元 个人简介   大家好,我是周 ...

  9. Serverless 时代下微服务应用全托管解决方案

    简介: 本文介绍了 Serverless 时代下微服务的发展以及过程中遇到的相对较复杂的需求,面对这些,阿里云 Serverless 应用引擎 SAE 将"Serverless"的 ...

  10. [FAQ] Phpstorm 代码提示功能失效问题

    如果是之前有代码提示,中间突然不出现提示了,那么考虑重建一下项目索引. 示例: Refer:Phpstorm代码提示 Link:https://www.cnblogs.com/farwish/p/13 ...