【问题标题】:making simple non-asynchronous post request in c# in 2021 [closed]2021年在c#中进行简单的非异步发布请求[关闭]
【发布时间】:2022-01-16 18:11:15
【问题描述】:

我正在尝试用 C# 编写一些非常简单的代码,该代码发出一个 HTTPS 发布请求并返回结果,但我对使用哪个库有点困惑。由于我的代码只需要运行一个 HTTPS 请求,我不需要任何异步,我觉得没有它会更简单。

似乎 System.Net.Http.HttpClient 不是为非异步用途而构建的,而 System.Net.WebRequest 在整个文档中都有关于它如何被弃用的警告,我应该改用 HttpClient。 WebRequest 的绝大多数教程和 StackOverflow 问题最终都有 5 年以上甚至 10 年以上的历史。

有人可以为我在 2021 年的用例指出一个好的教程或库吗?

【问题讨论】:

  • “由于我的代码只需要运行一个 HTTPS 请求,我不需要任何异步”-> 运行一个或一百个请求没有区别。 IO 代码是异步的,不管你是否使用 TPL。 HttpClient 是完全异步的,因此人们不会弄错它的工作原理
  • "我觉得没有它会更简单" -> 不是。除非您需要同步行为,否则请使用HttpClient 及其异步方法。

标签: c# httpclient httpwebrequest webclient


【解决方案1】:

为此绝对使用 HttpClient。它有一个可以使用的同步发送方法

var client = new HttpClient();
            
    var webRequest = new HttpRequestMessage(HttpMethod.Post, "http://your-api.com")
    {
        Content = new StringContent("{ 'some': 'value' }", Encoding.UTF8, "application/json")
    };

    var response = client.Send(webRequest);

    using var reader = new StreamReader(response.Content.ReadAsStream());
            
    return reader.ReadToEnd();
}

【讨论】:

  • 我收到了'HttpClient' does not contain a definition for 'Send'。知道为什么会这样吗?
  • 已在 .NET 5.0 中添加。请检查您使用的是哪个。 github.com/dotnet/runtime/pull/34948
  • 您知道它是否曾被添加到 .NET Framework 中吗?我在使用 .NET 5.0 导入一些 dll 时遇到了困难
  • 我不确定 .NET 框架。对我来说,如果我使用 .NET 框架,它也无法识别 Send 方法
【解决方案2】:

我认为你应该很适合System.Net.Http.HttpClient.Send(...)

这个函数不是异步的。

不过,使用异步函数也不是什么麻烦事。他们只是返回一个任务。如果访问返回任务的 Result 属性,线程将自动等待任务完成。所以基本上它会同步处理请求。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 2022-07-06
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多