一、Http请求与响应
Http是一种应用层协议,它是客户端与服务器之间进行数据交互的一种方式。而System.Net.Http则是提供了一组类库让开发人员可以更简单地完成Http请求和响应。
在HttpClient中,可以通过创建HttpClient实例来发送Http请求,然后可以通过HttpResponseMessage处理返回的响应。下面是一个简单的示例:
using System; using System.Net.Http; class Program { static async Task Main(string[] args) { using var client = new HttpClient(); using var response = await client.GetAsync("https://jsonplaceholder.typicode.com/posts/1"); using var content = response.Content; var result = await content.ReadAsStringAsync(); Console.WriteLine(result); } }
在上面这个示例中,我们创建了一个HttpClient实例,然后调用了GetAsync方法向指定Url发起Get请求,并使用ReadAsStringAsync方法将响应内容以字符串形式读取。这是我们经常使用的Http操作之一。
二、异步与同步
在HttpClient中,异步操作是首选,这种操作方式可以提高应用程序的性能,因为这样就不会阻塞进程的执行。每当在HttpClient上执行异步操作时,都会返回一个代表操作的Task或ValueTask。
HttpClient的所有异步方法都有对应的同步方法。但是,使用同步方法来访问Http资源可能会阻塞当前线程。这在Web应用程序中是一个大问题,因为一个单独的线程可以处理多个并发请求。因此建议在HttpClient中使用异步操作。
三、Http请求头和消息体
在HttpClient中,可以设置请求的Http头和消息体。可以通过HttpHeaders类来设置Http请求头,如下所示:
using System.Net.Http.Headers; class Program { static async Task Main(string[] args) { using var client = new HttpClient(); using var request = new HttpRequestMessage(HttpMethod.Get, "https://jsonplaceholder.typicode.com/posts/1"); request.Headers.Add("User-Agent", "HttpClientGetRequest"); using var response = await client.SendAsync(request); using var content = response.Content; var result = await content.ReadAsStringAsync(); Console.WriteLine(result); } }
在上面的示例中,我们在请求头中添加了一个”User-Agent”键,并将其值设置为”HttpClientGetRequest”。在实际场景中,我们可以设置更多的请求头参数。
另外,可以通过设置HttpContent的属性传递消息正文。HttpContent是一个抽象基类,其具体实现包括StringContent、ByteArrayContent、StreamContent、FormUrlEncodedContent和MultipartFormDataContent。下面是一个使用FormUrlEncodedContent的示例:
using System.Net.Http.Headers; class Program { static async Task Main(string[] args) { using var client = new HttpClient(); using var content = new FormUrlEncodedContent(new Dictionary<string, string> { {"key1", "value1"}, {"key2", "value2"} }); using var response = await client.PostAsync("http://example.com/upload", content); using var responseContent = response.Content; var result = await responseContent.ReadAsStringAsync(); Console.WriteLine(result); } }
上面的代码是一个Post请求,请求正文是一个键值对,通过FormUrlEncodedContent类传递。在实际应用中,我们可以使用StreamContent类、StringContent类等传递更复杂的Http正文。
四、Http客户端维护
HttpClient默认使用了HTTP keep-alive,这意味着它可以重复使用 TCP 连接来发送多个 HTTP 请求,从而提高性能。重复使用连接意味着网络和资源成本显着降低,但也可能增加需要维护连接池和执行请求所需的时间。
如果您需要客户端在用户操作中重复使用许多次,请考虑使用单个实例的HttpClient分配,而不是短时间内创建和丢弃实例。
具体实现方式是通过重复使用同一个实例并针对单个应用程序域进行共享来避免重复创建和释放连接池资源。做法是在创建HttpClient实例之后不要释放它,并在整个应用程序域中共享该实例。这样做可以让程序员更容易控制这些资源以及让HttpClient在内部处理连接池的配置和维护。
using System.Net.Http.Headers; class Program { static readonly HttpClient client = new HttpClient(); static async Task Main(string[] args) { using var content = new FormUrlEncodedContent(new Dictionary<string, string> { {"key1", "value1"}, {"key2", "value2"} }); using var response = await client.PostAsync("http://example.com/upload", content); using var responseContent = response.Content; var result = await responseContent.ReadAsStringAsync(); Console.WriteLine(result); } }
在上面的示例中,我们声明了一个静态的HttpClient实例,并在应用程序域中共享这个实例。
总结
System.Net.Http为我们提供了一组类库简化Http请求和响应的操作。在使用HttpClient时,异步是首选方式可以提高程序性能。我们可以设置Http请求头和消息体。如果需要在应用程序中频繁使用HttpClient,我们可以将HttpClient实例在应用程序域中共享,从而提高性能
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/158271.html