当前位置: 首页 > 知识库问答 >
问题:

如何用HttpClient替换WebClient?

芮叶秋
2023-03-14

我的asp中有以下WebClient。net mvc web应用程序:

using (WebClient wc = new WebClient()) // call the Third Party API to get the account id 
{
     string url = currentURL + "resources/" + ResourceID + "/accounts?AUTHTOKEN=" + pmtoken;
     var json = await wc.DownloadStringTaskAsync(url);
 }

那么,有人可以建议我如何将它从WebClient更改为HttpClient吗?

共有1个答案

西门旻
2023-03-14

您可以编写以下代码:

string url = 'some url';

// best practice to create one HttpClient per Application and inject it
HttpClient client = new HttpClient();

using (HttpResponseMessage response = client.GetAsync(url).Result)
{
    using (HttpContent content = response.Content)
    {
         var json = content.ReadAsStringAsync().Result;
    }
}

更新1:

如果您想用wait关键字替换对Result属性的调用,那么这是可能的,但您必须将此代码放入标记为async的方法中,如下所示

public async Task AsyncMethod()
{
    string url = 'some url';

    // best practice to create one HttpClient per Application and inject it
    HttpClient client = new HttpClient();

    using (HttpResponseMessage response = await client.GetAsync(url))
    {
        using (HttpContent content = response.Content)
        {
           var json = await content.ReadAsStringAsync();
        }
     }
}

如果您错过了方法中的async关键字,您可能会得到一个编译时错误,如下所示

“等待”运算符只能在异步方法中使用。考虑使用异步修饰符标记此方法,并将其返回类型更改为任务

更新2:

回答您关于将'WebClient'转换为'WebRequest'的原始问题,这是您可以使用的代码,...但是微软(和我)推荐你使用第一种方法(通过使用HttpClient)。

string url = currentURL + "resources/" + ResourceID + "/accounts?AUTHTOKEN=" + pmtoken;

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = "GET";

using (WebResponse response = httpWebRequest.GetResponse())
{
     HttpWebResponse httpResponse = response as HttpWebResponse;
     using (StreamReader reader = new StreamReader(httpResponse.GetResponseStream()))
     {
         var json = reader.ReadToEnd();
     }
}

如果使用C#8及以上版本,那么就可以编写非常优雅的代码

public async Task AsyncMethod()
{
    string url = 'some url';

    // best practice to create one HttpClient per Application and inject it
    HttpClient client = new HttpClient();

    using HttpResponseMessage response = await client.GetAsync(url);
    using HttpContent content = response.Content;
    var json = await content.ReadAsStringAsync();
}   // dispose will be called here, when you exit of the method, be aware of that

更新3

要了解为什么建议使用isHttpClient而不是WebRequestWebClient,您可以参考以下链接。

在HttpClient和WebClient之间做出决定

http://www.diogonunes.com/blog/webclient-vs-httpclient-vs-httpwebrequest/

HttpClient与HttpWebRequest

中的WebClient和HTTPWebRequest类之间有什么区别。网

http://blogs.msdn.com/b/henrikn/archive/2012/02/11/httpclient-is-here.aspx

 类似资料:
  • 问题内容: 我是Aurelia的新手。 您将如何更改以下代码以提供虚拟HttpClient,例如json读取器,而不是仅提供静态json数据集,从而无需开发服务器。 问题答案: 要使原始文章中的演示代码达到可以替代HttpClient实现的状态,需要执行几个步骤。 在类的构造函数中删除配置代码… 这些行: users.js 应移至文件: main.js 现在我们的users.js文件应如下所示:

  • 问题内容: 我正在创建一个Android应用程序,并通过HttpClient将数据从Android应用程序发送到servlet。我使用HttpPost方法。 我在Android开发人员网站上了解到,Apache HttpClient库在Android Froyo 2.2中存在一些错误,毕竟使用HttpUrlConnection而不是HttpPost是一个好习惯。所以我想将我的HttpPost代码转

  • 问题内容: 我试图将字符串分成数组并替换为,但无法做到,我也尝试了String.replaceAll这样的东西。 我想提供一个通往JNI的路径,并且它只能以这种方式读取。 问题答案: 在这种情况下不要使用- 这是用正则表达式指定的,这意味着您需要更多的转义。这应该很好: 请注意,由于Java字符串文字中的原因,反斜杠加倍-因此此处涉及的 实际 字符串是“单反斜杠”和“双反斜杠”-而不是双倍和四倍。

  • 我有以下布局 一切正常,但我想用一个片段替换浏览器 这不是重新调整ViewPager的间距,我该怎么办???

  • 问题内容: 尝试简单地替换一些新行。尝试了3种不同的方法,但我没有任何改变: 这些都应该起作用,但是我仍然可以换行。它们是双精度的:“ \ r \ r”。那不应该让这些失败吗? 问题答案: 已经有在换行符之前 替换 插入* 标签的[]功能: ~~~~* 示例(键盘): 但是,如果仍然无法正常工作,请确保文本被双引号引起来。 那是因为单引号不会“扩展”转义序列,例如与双引号字符串相比。引用PHP文档

  • 我得到了一个导入的文本块,但格式并不总是那么完美。之后我会尝试用jquery解决这个问题。所以我开始用 替换 : null null 但替换不起作用。最终的html应该如下所示: