【问题标题】:AspNetCore Can't Get Value of Payload In POST ActionAspNetCore 无法在 POST 操作中获取有效负载的值
【发布时间】:2023-03-08 04:49:02
【问题描述】:

尝试获取一个简单的 post 端点来读取数据。我似乎无法弄清楚如何完成将 post 有效负载绑定到方法参数的简单任务。

[Route("[controller]")]
[ApiController]

public class TestController : ControllerBase
{
    [HttpPost]
    public object Post(string data)
    {
        return Ok();
    }
}

我在 Ok() 上有一个断点。我正在使用 cURL 进行测试。

我试过这个命令 curl -d data:"hello" -X POST http://localhost:80/test 和这个命令 curl -d "hello" -X POST http://localhost:80/test

data 参数在断点处始终为空。

如果我将 [FromBody] 添加到参数中:

public object Post([FromBody] string data)
{
    return Ok();
}

断点从未到达,asp net core 内部返回 400 - 输入无效。但它没有记录任何关于输入无效的原因。

【问题讨论】:

    标签: asp.net-core curl post .net-core http-post


    【解决方案1】:

    ASP .net core 默认只支持 POST 中的 json 载荷。

    由于您尝试发送纯文本,因此您需要手动从请求中获取有效负载。开箱即用不支持绑定。

    这是获取包含纯文本的已发布文件的解决方案。

    例如。 curl -F data=@test.txt -X POST http://localhost:80/test

    首先删除string data 参数。

    将此方法添加到您的控制器:

        private string GetPostedFile(string fileName)
        {
            IFormFile data = Request.Form.Files[fileName];
            var bytes = new byte[data.Length];
            var result = data.OpenReadStream().ReadAsync(bytes).Result;
            return System.Text.Encoding.Default.GetString(bytes);
        }
    

    现在您可以获取数据,在您的 POST 处理程序中引用 GetPostedFile 方法,如下所示:

    [HttpPost]
    public object Post()
    {
        string data = GetPostedFile("data");
        return Ok();
    }  
    

    这将获取您发布的文件的值,在 curl 命令中称为“数据”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多