如何在Asp.Net Core控制器中接收原始请求正文内容?

ASP.NET Core控制器中,接收原始请求正文内容的方法包括使用[FromBody]标记来解析JSON或字符串数据,以及直接读取Request.Body来处理二进制数据。

在Asp.Net Core中,控制器作为处理HTTP请求的核心组件,有时需要接收来自客户端的原始请求正文内容,这些内容可能包括JSON数据、纯文本或二进制数据等,本文将详细探讨如何在Asp.Net Core控制器中接收这些不同类型的请求正文,并提供相应的示例代码和解释。

一、接收JSON数据

Asp.Net Core控制器如何接收原始请求正文内容详解

JSON(JavaScript Object Notation)是Web开发中最常用的数据格式之一,在Asp.Net Core控制器中,可以通过使用[FromBody]特性来接收JSON数据,以下是一个示例:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public ActionResult<string> Get()
    {
        return "ok";
    }
    [HttpPost]
    [Route("PostX")]
    public ActionResult<string> Post([FromBody] string value)
    {
        return value;
    }
}

在这个例子中,Post方法通过[FromBody]特性接收一个字符串类型的参数value,当客户端发送一个Content-Type为application/json的POST请求时,ASP.NET Core模型绑定器会将请求正文解析为字符串并赋值给value变量,客户端可以发送如下请求:

User-Agent: Fiddler
Host: localhost:5000
Content-Type: application/json
Content-Length: 16
请求body:
{"123456"}

通过后台调试和Fiddler抓包,我们可以看到请求输入和返回值,需要注意的是,如果接收类型为字符串时,请求体只能是字符串,不能传JSON对象,如果需要接收JSON对象,应该定义一个对应的类作为参数。

二、接收纯文本数据

对于纯文本数据,可以将Content-Type设置为text/plain,在这种情况下,无需使用[FromBody]特性,因为字符串参数会默认从请求正文中读取,以下是一个示例:

[HttpPost]
[Route("PostText")]
public async Task<string> PostText([FromBody] string text)
{
    return text;
}

客户端可以发送如下请求:

User-Agent: Fiddler
Host: localhost:5000
Content-Type: text/plain
Content-Length: 16
请求body:
"Hello, World!"

控制器将直接接收并返回该文本。

三、接收二进制数据

对于二进制数据,如图片或文件,Content-Type可能是multipart/form-data或application/octet-stream,在这种情况下,可以使用IFormFile或自定义类型接收文件内容,以下是一个异步方法读取二进制数据的示例:

[HttpPost]
[Route("Upload")]
public async Task<IActionResult> Upload(IFormFile file)
{
    if (file != null && file.Length > 0)
    {
        // 处理文件上传
    }
    return BadRequest("Invalid file");
}

处理二进制数据时,通常需要使用Stream或byte[]类型,并通过异步方法读取,以确保性能和内存效率。

四、自定义输入格式化程序

除了上述常见的数据类型外,Asp.Net Core还允许通过自定义输入格式化程序来处理非标准的数据格式,这涉及创建一个实现TextInputFormatter接口的类,并在服务容器中注册该格式化程序,以下是一个简单的示例:

Asp.Net Core控制器如何接收原始请求正文内容详解
public class PlainTextInputFormatter : TextInputFormatter
{
    public override bool CanRead(InputFormatterContext context)
    {
        return context.HttpContext.Request.ContentType == "text/plain";
    }
    public override async Task<object> ReadRequestBodyAsync(InputFormatterContext context)
    {
        using (var reader = new StreamReader(context.HttpContext.Request.Body))
        {
            return await reader.ReadToEndAsync();
        }
    }
}

然后在Startup.cs的ConfigureServices方法中注册这个自定义格式化程序:

services.AddMvc(options =>
{
    options.InputFormatters.Insert(0, new PlainTextInputFormatter());
});

这样,控制器就能接收到并处理非JSON格式的原始请求正文了。

Asp.Net Core控制器通过模型绑定机制灵活地处理各种请求正文内容,从JSON数据到纯文本和二进制文件,都有相应的处理方式,了解这些基础知识有助于构建适应性强、功能丰富的API服务。

到此,以上就是小编对于“Asp.Net Core控制器如何接收原始请求正文内容详解”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。

原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1374343.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
未希新媒体运营
上一篇 2024-12-03 14:32
下一篇 2024-12-03 14:34

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入