使用C#HttpClient,如何将字符串HttpContent发布到ASP.net核心web API?

使用C#HttpClient,如何将字符串HttpContent发布到ASP.net核心web API?,c#,asp.net-web-api,dotnet-httpclient,C#,Asp.net Web Api,Dotnet Httpclient,在客户端,我使用HttpClient类将请求发布到服务器端的ASP.net核心web API 我想在请求主体中发送一个字符串(“OK”),在头中发送一个字符串参数(numStr=5),我读了很多类似的线程,但仍然失败 以下是客户端方法: public async void SendBodyAsync(Action<string> onRespond) { try { string URL = "http://localhost:60039/a

在客户端,我使用
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);
    }
}
如果我删除行
request.Content=newstringcontent(“OK”,Encoding.UTF8,“text/plain”)
从客户端方法中,响应值为
15
,这是正确的

但是对于
request.Content
,客户端显示错误:

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

服务器断点未触发,因此请求未成功发送

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

我的问题是,

  • 如何在Http正文中正确发送字符串,它不是参数,可以很长(就像字符串格式的完整播放器配置文件),因此它不适合用于标头、查询或
  • 如何在服务器端正确接收和解析请求正文中的字符串

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

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

    另外请注意,如果您没有指定accept/content类型,则在.NETCore中默认为application/json


    s也考虑将AdMultAddio方法变成一个异步方法

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

    问题解决了吗?我刚刚重新创建了服务器项目,它工作了,没有做任何更改,我不知道为什么。但无论如何,谢谢你阅读我的帖子。我想看到相同错误消息的人可以尝试重新创建项目。希望有帮助。那太好了,你可以发布你是如何克服它的。谢谢你的建议,现在由于客户端不再给出错误(只是重新创建了服务器项目),我在服务器端添加了一个StreamReader来读取Request.Body中的流,并添加了stream.ReadToEndAsync()来获取字符串。由于我必须“等待”stream.ReadToEndAsync(),因此我必须将该方法标记为“异步任务”。我进一步的问题是,在方法中使用“wait”,如果该方法被描述为“async Task”,那么当许多客户端调用该方法时,该方法不会阻塞主线程,对吗?该方法的许多实例将异步运行?hi@solidcomer是的,这是正确的,通过使用异步任务,您将不会阻塞主UI线程(例如WPF应用程序)。释放应用程序以处理其他请求,在巨大负载下,这将有助于最大限度地减少“线程饥饿”,这里有一篇写得很好的文章供参考。
    [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();
        }
    }