C# 发出异步的Get请求

8c0578d7c6a6fb43160cfc3d4e76920f.png

下列的下载代码示例是 HttpClientSample。它以不同的方式异步调用Web 服务。为了演示本例使用的不同方法,使用了命令行参数。

示例代码使用了以下名称空间:

System
System.Linq 
System.Net
System.Net.Http
System.Net.Http.Headers 
System.Threading
System.Threading.Tasks

f8bda77920d69cd6d6ae40abd399c8e6.png

第一段代码实例化一个 HttpClient 对象,把它赋予私有字段 _httpClient,以进行重用。这个 HttpClient 对象是线程安全的,所以一个 HttpClient 对象就可以用于处理多个请求。HttpClient 的每个实例都维护它自己的线程池,所以 HttpClient 实例之间的请求会被隔离。

0e73dcf5022c54b0a6301af564068ad7.png

接着调用 GetAsync,给它传递要调用的方法的地址,把一个 HTTP GET 请求发送给服务器。GetAsync 调用被重载为带一个字符串或 URI 对象。

06f16ed682947ac380652ca640a7a16a.png

对GetAsync 的调用返回一个HttpResponseMessage 对象。HttpResponseMessage 类表示包含标题、状态和内容的响应。检查响应的IsSuccessfulStatusCode属性,可以确定请求是否成功。如果调用成功,就使用 ReadAsStringAsync 方法把返回的内容检索为一个字符串:

private const string NorthwindUrl =
  "http://services.data.org/Northwind/Northwind.svc/Regions"; 
private const string IncorrectUrl =
  "http://services.data.org/Northwind1/Northwind.svc/Regions";


private HttpClient _httpClient; 
public HttpClient HttpClient =>
  _httpClient ?? (_httpClient = new HttpClient());
  
private async Task GetDataSimpleAsync()
{
  HttpResponseMessage response = await HttpClient.GetAsync(NorthwindUrl); 
  if(response.IsSuccessStatusCode)
    {
      Console.WriteLine($"Response Status Code: {(int)response.StatusCode} " +
        $"{response.ReasonPhrase}") ;
      string responseBodyAsText =await response.Content.ReadAsStringAsyne();
      Console.WriteLine($"Received payload of {responseBodyAsText.Length} characters");
      Console.WriteLine();
      Console.WriteLine(responseBodyAsText);
    }
  }
}

cd2bd08f9b3a89d2cf0fce47b5dcb78f.png

用命令行参数 -s 执行这段代码,产生以下输出: 

Response Status Code: 200 OK
Received payload of 3379 characters
<?xml version="1.0" encoding="utf-8"?>
<!- ... ->

a623d33d74ff707dce28ff0b57061496.png

注意:

因为 HttpClient 类使用 GetAsync 方法调用,且使用了 await 关键字,所以返回调用线程,并可以执行其他工作。GetAsync 方法的结果可用时,就用该方法继续线程,响应写入 response 变量。

4f3fd86ca9b8708ef2bdeadb267b2f4b.png

2aa257940191660ac1a04d8b7bcae737.png

 微信公众号 

Dotnet讲堂

抱抱歉抱歉,抱歉,我抱歉,我无抱歉,我无法抱歉,我无法回抱歉,我无法回答抱歉,我无法回答仅抱歉,我无法回答仅包抱歉,我无法回答仅包含抱歉,我无法回答仅包含一个抱歉,我无法回答仅包含一个单抱歉,我无法回答仅包含一个单词抱歉,我无法回答仅包含一个单词的抱歉,我无法回答仅包含一个单词的问题抱歉,我无法回答仅包含一个单词的问题,抱歉,我无法回答仅包含一个单词的问题,因抱歉,我无法回答仅包含一个单词的问题,因为抱歉,我无法回答仅包含一个单词的问题,因为它抱歉,我无法回答仅包含一个单词的问题,因为它不抱歉,我无法回答仅包含一个单词的问题,因为它不具抱歉,我无法回答仅包含一个单词的问题,因为它不具备抱歉,我无法回答仅包含一个单词的问题,因为它不具备足抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够为抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够为您抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够为您提抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够为您提供抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够为您提供更抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够为您提供更好抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够为您提供更好的抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够为您提供更好的回抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够为您提供更好的回答抱歉,我无法回答仅包含一个单词的问题,因为它不具备足够的上下文信息。请提供更多的背景或问题细节,以便我能够为您提供更好的回答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值