C# HTTP请求 异步(async await)

摘要:
本来也是很简单的东西,但是看着别扭。现在谁还用HttpWebRequest写起来麻烦的要死publicasyncTaskPost(){HttpClienthttpClient=newHttpClient();HttpContenthttpContent=newStringContent("");varresponse=awaithttpClient.PostAsJsonAsync;varcontent=awaitresponse.Content.ReadAsStringAsync();httpContent.Dispose();returncontent;}publicasyncTaskGet(){HttpClienthttpClient=newHttpClient();varresponse=awaithttpClient.GetStringAsync;httpContent.Dispose();}这段代码与上面还有有区别的区别在于,上述部分是直接一个线程,由这个线程去进行http请求,来达到异步的效果这一段呢!是这个http请求这一个过程异步。这边就不写具体验证代码了。
        static void Main(string[] args)
        {
            new Task(() =>
            {
                Invoke();
            }).Start();
            Console.WriteLine("我是主线程");
            Console.ReadKey();
        }

        public static async void Invoke()
        {
            var result = Keep();
            Console.WriteLine("执行其他的");
            string str = await result;  //等待返回
            Console.WriteLine(str);  //输出返回
        }

        public static async Task<string> Keep()
        {
            HttpWebRequest request = WebRequest.Create("http:/*****************") as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";     //这里一定不要忘记了 我排查了好久 发现这里没有写这一句  弄的怀疑人生了 后来通过抓包对比 才发现这个差距  粗心了
            string data = "userId=7c509e59-9179-4fc3-b00a-a33007b1068e&agentId=2acbf00f-aa58-44f6-88c8-6d7027b78a7f&companyId=64436ad0-8ef4-430a-b6a4-08cac3b19c0a&versionTime=1553654309167";
            byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
            request.ContentLength = buf.Length;
            Stream newStream = request.GetRequestStream();
            newStream.Write(buf, 0, buf.Length);
            newStream.Close();
            HttpWebResponse response = await request.GetResponseAsync() as HttpWebResponse;
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
            string result = reader.ReadToEnd();
            return result;
        }

如果你不写request.ContentType 那么用下面的这种也可以

        static void Main(string[] args)
        {
            new Task(() =>
            {
                Invoke();
            }).Start();
            Console.WriteLine("我是主线程");
            Console.ReadKey();
        }

        public static async void Invoke()
        {
            var result = Keep();
            Console.WriteLine("执行其他的");
            string str = await result;  //等待返回
            Console.WriteLine(str);  //输出返回
        }

        public static async Task<string> Keep()
        {
            string url = "http://message.sungoin.com/platform-message/getPlatformClientMsg";
            string data = "userId=7c509e59-9179-4fc3-b00a-a33007b1068e&agentId=2acbf00f-aa58-44f6-88c8-6d7027b78a7f&companyId=64436ad0-8ef4-430a-b6a4-08cac3b19c0a&versionTime=1553654309167";
            url = url + "?" + data;
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "POST";
            HttpWebResponse response = await request.GetResponseAsync() as HttpWebResponse;
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
            string result = reader.ReadToEnd();
            return result.ToString();
        }

============================================2020年6月28日再次编辑=========================================================

今天看到一篇异步请求的文章,然后点进去一看,发现是自己写的,这感觉有点怪异,

然后我决定更新一下这个博客吧,都2020了,还用老版本的那种写法,很麻烦的。本来也是很简单的东西,但是看着别扭。

HttpClient的异步操作 还是写一下吧! 现在谁还用HttpWebRequest 写起来麻烦的要死
publicasyncTask<string>Post()
{
HttpClienthttpClient=newHttpClient();
HttpContenthttpContent=newStringContent("");
varresponse=awaithttpClient.PostAsJsonAsync(url,httpContent);
varcontent=awaitresponse.Content.ReadAsStringAsync();
httpContent.Dispose();
return
content;
}
publicasyncTask<string>Get()
{
HttpClienthttpClient=newHttpClient();
varresponse=awaithttpClient.GetStringAsync(url);
httpContent.Dispose();
}

这段代码与上面还有有区别的
区别在于,上述部分是直接一个线程,由这个线程去进行http请求,来达到异步的效果
这一段呢!是这个http请求这一个过程异步。
这边就不写具体验证代码了。
publicasyncstringPost()
{
HttpClienthttpClient=newHttpClient();
HttpContenthttpContent=newStringContent("");
varresponse=httpClient.PostAsJsonAsync(url,httpContent);
varcontent=response.Content.ReadAsStringAsync();
httpContent.Dispose();
return content;
}
非异步

免责声明:文章转载自《C# HTTP请求 异步(async await)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇移动端前端常见的触摸相关事件touch、tap、swipejs生成唯一的uuid下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

QString和string互转中文字符

string -> QString 1 std::string strStd = "可可西";2 QString strQ = QString::fromLocal8Bit(strStd.c_str()); QString -> string 1 QString strQ("可可西");2 std::string strStd= strQ...

iOS字符串处理_替换(去掉空格换行)、截取

以下代码主要实现了:1、截取"@@"前的字符串;  2、去掉字符串中的"##";  3、去掉字符串中的空格和换行。 希望相互学习相互指正。 -----ViewController.m内容如下:------ #import "ViewController.h" #import "HandleString.h" @interface ViewControlle...

为什么一个Http Header中的空格会被骇客利用

导读:本文通过一个Netty的一个issue来学习什么是"http request smuggling"、它产生的原因与解决方法,从而对http协议有进一步了解。 前言 前阵子在Netty的issue里有人提了一个问题 http request smuggling, cause by obfuscating TE header,描述了一个Netty的...

java对象序列化、gzip压缩解压缩、加密解密

有时在应用中需要将java对象序列化存储起来,有的需要压缩,有的需要加密 EncryptUtil.java Java代码 packageorg.test.demo; importjava.io.UnsupportedEncodingException; importjava.security.InvalidKeyException; importj...

RocketMQ(八)RocketMQ的Consumer负载均衡

一、问题描述 RocketMQ的Consumer是如何做的负载均衡?比如:5个Consumer进程同时消费一个Topic,这个Topic只有4个queue会出现啥情况?反之Consumer数量小于queue的数据是啥情况? 二、源码剖析 1、RebalancePushImpl public class RebalancePushImpl extends R...

jquery动态实现填充下拉框

 当点下拉框时动态加载后台数据。 后台代码 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8...