【问题标题】:Using C# HttpClient, how to POST a string HttpContent to ASP.net Core web API?使用 C# HttpClient,如何将字符串 HttpContent 发布到 ASP.net Core Web API?
【发布时间】:2020-02-26 19:01:57
【问题描述】:

在客户端,我使用HttpClient 类向服务器端的 ASP.net 核心 Web API 发布请求。

我想在请求的正文中发送一个字符串 ("OK"),并在标头中发送一个字符串参数 (numStr=5),我已经阅读了许多类似的线程,但仍然失败。

这是客户端方法:

public async void SendBodyAsync(Action<string> onRespond)
{
    try
    {
        string URL = "http://localhost:60039/api/calculator/AddMore";

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, URL);
        request.Headers.Add("numStr", "5");

        request.Content = new StringContent("OK", Encoding.UTF8, "text/plain");   //causes error

        HttpResponseMessage response = await mHttpClient.SendAsync(request);
        response.EnsureSuccessStatusCode();

        string result = await response.Content.ReadAsStringAsync();
        onRespond(result);
    }
    catch (HttpRequestException ex)
    {
        Debug.LogError(ex);       //Unity3D console Debug
        onRespond(null);
    }
}

这是服务器操作:

[Route("api/[controller]/[action]")]
[ApiController]
public class CalculatorController : ControllerBase
{
    public string AddMore([FromHeader]string numStr)
    {
        //string bodyStr;
        //get string from Request.Body and set the value to bodyStr
        return (int.Parse(numStr) + 10).ToString();
    }
}

如果我从客户端方法中删除request.Content = new StringContent("OK", Encoding.UTF8, "text/plain"); 行,则响应值为15,这是正确的。

但是使用request.Content,客户端显示错误:

发送请求时出错---> System.Net.WebException:请求需要缓冲数据以 成功。

服务器断点没有触发,所以请求没有成功发送出去。

我使用HttpListener 创建了另一个非常简单的服务器方法,它将request.Content 正确读取为clientContext 流。我认为问题可能在于request.Content 不等于 Http 正文,并且不太可能是错误消息所述的缓冲问题。

我的问题是,

  1. 如何在 Http 正文中正确发送字符串,它不是参数并且可以很长(如字符串格式的完整玩家资料),因此不适用于标题或查询或...
  2. 如何在服务器端正确接收和解析请求正文中的字符串?

非常感谢您阅读我的帖子。

【问题讨论】:

  • 问题解决了吗?
  • 我刚刚重新创建了服务器项目,它工作正常,没有进行任何更改,我不知道为什么。但无论如何感谢您阅读我的帖子。我猜看到相同错误消息的人可以尝试重新创建项目。希望对您有所帮助。
  • 太好了,你可以发布你是如何克服它的。

标签: c# asp.net-web-api dotnet-httpclient


【解决方案1】:

查看您的 AddMore 方法。我认为您还应该使用 [FromBody] 字符串参数 来获取正文内容,我没有看到它指定。

还要注意,如果您没有指定接受/内容类型,则默认情况下它是 .NET 核心中的 application/json

P.S 还可以考虑使您的 AddMore 方法成为异步方法

【讨论】:

  • 感谢您的建议,现在由于客户端不再报错(只是重新创建了服务器项目),我在服务器端添加了一个 StreamReader 来从 Request.Body 读取流,并且stream.ReadToEndAsync() 获取字符串。由于我必须“等待”stream.ReadToEndAsync(),因此我必须将该方法标记为“async Task”。我进一步的问题是,在方法中使用“await”,如果该方法被描述为“async Task”,当许多客户端调用此方法时,该方法不会阻塞主线程,对吗?该方法的许多实例将异步运行?
  • hi @solidcomer 是的,这是正确的,通过使用异步任务 你不会阻塞你的主 UI 线程(例如在 WPF 应用程序的情况下)。释放你的应用程序来处理其他请求,在巨大的负载下,这将有助于最大限度地减少“线程饥饿”,这是一篇写得很好的文章供参考。 coderjony.com/blogs/…
【解决方案2】:

我不知道为什么我不能编辑自己的线程。只想说我重新创建了一个项目并粘贴了相同的代码,并且它有效。 也许看到错误消息“发送请求时发生错误---> System.Net.WebException:请求需要缓冲数据才能成功”的人可以尝试相同。 希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2017-12-09
    • 2018-02-28
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多