C#多线程TPL模式下使用HttpClient

 更新时间:2022年03月22日 10:22:08   作者:.NET开发菜鸟  
这篇文章介绍了C#多线程TPL模式下使用HttpClient的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、引言

我们有时侯需要在程序里面调用Http接口、请求http资源、编写http爬虫等的时候都需要在程序里面进行Http请求。很多人习惯的WebClient、HttpWebRequest在TPL下有很多用起来不方便的地方,TPL下推荐使用HttpClient(using System.Net.Http),而且在.NET Core下已经不在支持WebClient等。

1、发送Get请求

HttpClient发出Get请求获取文本响应,如下面的代码:

// 实例化HttpClient对象
HttpClient hc = new HttpClient();
// 发送Get请求获取
string strContent =await hc.GetStringAsync("http://www.baidu.com");

2、发送Post请求

HttpClient发送Post请求使用Task<HttpResponseMessage> PostAsync(string requestUri,HttpContent content)方法,方法的第一个参数是请求的地址,第二个参数用来设置请求内容。HttpContent是抽象类,主要有下面的几个子类:

  • FormUrlEncodedContent:表示用来发送表单格式的请求。
  • StringContent:表示用来发送字符串请求。
  • MultipartFormDataContent:Multipart发送表单请求,一般带上传文件信息。
  • StreamContent:发送流内容。

二、实例

下面我们看一个使用HttpClient发送Post请求的实例。我们创建一个MVC项目,控制器里面有三个Post请求的方法,分别模拟三种不同内容的Http请求,代码如下:

using System.Web;
using System.Web.Mvc;

namespace HttpClientMVCTestDemo.Controllers
{
    public class LoginRequest
    {
        public string userName { get; set; }
        public string password { get; set; }
    }


    public class HttpClientTestController : Controller
    {
        // GET: HttpClientTest
        public ActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// 发送表单请求
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        [HttpPost]
        public string Login(string userName, string password)
        {

            if (userName == "admin" && password == "123")
            {
                return "ok";
            }
            else
            {
                return "error";
            }
        }

        /// <summary>
        /// 发送Json格式的请求
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        [HttpPost]
        public string Login2(LoginRequest data)
        {
            string userName = data.userName;
            string password = data.password;
            if (userName == "admin" && password == "123")
            {
                return "ok";
            }
            else
            {
                return "error";
            }
        }

        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        [HttpPost]
        public string Upload(HttpPostedFileBase file)
        {
            string userName = Request.Headers["UserName"];
            string password = Request.Headers["Password"];
            if (userName == "admin" && password == "123")
            {
                // 保存文件
                file.SaveAs(Server.MapPath("~/" + file.FileName));
                return "ok";
            }
            else
            {
                return "error";
            }
        }
    }
}

然后创建一个Winform程序,用来发送Http请求。界面上有三个按钮,分别发送三种不同内容的Http请求。

1、发送表单内容的请求

我们看下面发送表单请求的代码:

/// <summary>
/// 模拟发送表单内容的Http请求
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnForm_Click(object sender, EventArgs e)
{
    // 实例化对象
    HttpClient client = new HttpClient();
    Dictionary<string, string> dic = new Dictionary<string, string>();
    dic["userName"] = "admin";
    dic["password"] = "123";
    // 参数
    FormUrlEncodedContent content = new FormUrlEncodedContent(dic);
    // 发送post请求
    HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/login", content);
    // 返回报文体
    // responseMsg.Content 
    // 返回响应头
    // responseMsg.Headers
    // 返回响应码
    // responseMsg.StatusCode
    // 获取返回值 这里确定返回的是字符串,调用string
    string msg =await responseMsg.Content.ReadAsStringAsync();
    MessageBox.Show($"响应码:{responseMsg.StatusCode.ToString()}");
    MessageBox.Show($"返回内容:{msg}");
}

程序运行结果:

点击“确定”,查看返回内容:

2、发送json格式内容的请求

下面是发送json内容请求的代码:

/// <summary>
/// 发送json
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnJson_Click(object sender, EventArgs e)
{
    // json格式的字符串
    string jsonData = "{userName:'admin',password:'123'}";
    // 实例化对象
    HttpClient client = new HttpClient();
    StringContent content = new StringContent(jsonData);
    // 设置contentType,必须要设置 设置为json格式,MVC会自动转换成Model类型
    content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
    // 发送post请求
    HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/login2", content);
    // 获取返回值
    string msg = await responseMsg.Content.ReadAsStringAsync();
    MessageBox.Show($"响应码:{responseMsg.StatusCode.ToString()}");
    MessageBox.Show($"返回内容:{msg}");
}

3、上传文件

看一下上传文件的代码:

/// <summary>
/// 上传文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnUpload_Click(object sender, EventArgs e)
{
    // 实例化对象
    HttpClient client = new HttpClient();
    MultipartFormDataContent content = new MultipartFormDataContent();
    content.Headers.Add("UserName", "admin");
    content.Headers.Add("Password", "123");
    using (Stream stream = File.OpenRead(@"F:\数据库.txt"))
    {
        content.Add(new StreamContent(stream), "file", "test.txt");
        HttpResponseMessage responseMsg = await client.PostAsync("http://localhost:55179/HttpClientTest/Upload", content);
        // 返回值
        string msg = await responseMsg.Content.ReadAsStringAsync();
        MessageBox.Show($"响应码:{responseMsg.StatusCode.ToString()}");
        MessageBox.Show($"返回内容:{msg}");
    }
}

点击上传文件按钮以后,就能在服务器端看到我们上传的文件了。

到此这篇关于C#多线程TPL模式下使用HttpClient的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C# 实现基于ADO.NET框架的DBHelper工具类(简化数据库操作)

    C# 实现基于ADO.NET框架的DBHelper工具类(简化数据库操作)

    ADO.NET是.NET框架中用于与数据库交互的核心组件,提供了一套用于连接数据库、执行SQL查询、插入、更新和删除数据的类库,包括SqlConnection、SqlCommand、SqlDataReader等,本文介绍如何使用DBHelper类封装数据库操作,以提高代码的可维护性和复用性,感兴趣的朋友一起看看吧
    2024-08-08
  • C#实现位图转换成图标的方法

    C#实现位图转换成图标的方法

    这篇文章主要介绍了C#实现位图转换成图标的方法,可实现将bmp格式位图转换成ico格式图标的功能,需要的朋友可以参考下
    2015-06-06
  • C#调用FFmpeg操作音视频的实现示例

    C#调用FFmpeg操作音视频的实现示例

    本文主要介绍了C#调用FFmpeg操作音视频的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C#常用目录文件操作类实例

    C#常用目录文件操作类实例

    这篇文章主要介绍了C#常用目录文件操作类,实例分析了C#针对目录的读取、检测及查找等相关操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • c#利用webmail邮件系统发送邮件示例分享

    c#利用webmail邮件系统发送邮件示例分享

    在C#中发送邮件的方式有2种,一种是使用webmail方式进行发送,另外一种就是采用netmail发送的方式,这篇文章介绍了c#使用webmail方式发送邮件示例,大家参考使用吧
    2014-01-01
  • Unity3D在Preview中打印日志的方法

    Unity3D在Preview中打印日志的方法

    这篇文章主要为大家详细介绍了Unity3D在Preview中打印日志的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • C#实现子类与父类的相互转换

    C#实现子类与父类的相互转换

    这篇文章主要介绍了C#实现子类与父类的相互转换,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 基于Avalonia实现自定义弹窗的示例详解

    基于Avalonia实现自定义弹窗的示例详解

    对于使用avalonia的时候某些功能需要到一些提示,比如异常或者成功都需要对用户进行提示,所以需要单独实现弹窗功能,并且可以自定义内部组件,这一期将手动实现一个简单的小弹窗,并且很容易自定义,希望大家喜欢
    2023-02-02
  • 对C# 多态的理解

    对C# 多态的理解

    这篇文章主要介绍了对C# 多态的理解,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-08-08
  • c# 动态加载dll文件,并实现调用其中的方法(推荐)

    c# 动态加载dll文件,并实现调用其中的方法(推荐)

    下面小编就为大家带来一篇c# 动态加载dll文件,并实现调用其中的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论