在.NET Core控制器中获取AJAX传递的Body参数

.Net Core是支持前后端不分离式的开发的,如果在原始系统中采用不分离式开发,后面需要在原系统中增加功能,并且新的服务采用其他语言开发,且系统原来功能保持原样,这样前端系统可以单独调用新开发的接口。

但是,如果该系统涉及到权限控制,因为Net Core前后端不分离可以获取到用户的登录信息,但是新的服务没有此功能,无法获取到用户的权限信息,这时就需要通过Net Core转调一次接口才行。

前端代码如下

复制代码
$.ajax({
    url: '/your/action',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify({ 
        property1: 'value1', 
        property2: 'value2' 
    }),
    success: function(response) {
        console.log(response);
    }
});

1. 使用FromBody特性

这是最推荐的方式,适用于JSON格式的请求体:

复制代码
[HttpPost]
public IActionResult YourAction([FromBody] YourModel model)
{
    // 直接使用model对象
    // 调用其他语言写的接口
    return Ok();
}

public class YourModel
{
    public string Name { get; set; }
    public int Age { get; set; }
}

2. 动态类型接收

如果不确定参数结构或想使用动态类型:

复制代码
[HttpPost]
public IActionResult YourAction([FromBody] dynamic data)
{
    string value1 = data.property1;
    string value2 = data.property2;
    // 调用其他语言写的接口
    return Ok();
}

3. 直接从Request.Body读取

对于更复杂的场景,可以手动读取请求体:

复制代码
[HttpPost]
public async Task<IActionResult> YourAction()
{
    // 启用缓冲(如果还没有启用)
    Request.EnableBuffering();
    
    // 获取原始请求体
    Request.Body.Position = 0;

    using (var reader = new StreamReader(Request.Body))
    {
        // 获取Body参数
        var body = await reader.ReadToEndAsync();
        // 调用其他语言写的接口
    }
    return Ok();
}

4. 使用JObject解析

使用Newtonsoft.Json的JObject:

复制代码
[HttpPost]
public IActionResult YourAction([FromBody] JObject data)
{
    var model = data.ToObject<YourModel>();
    // 或者直接访问属性
    var value = data["propertyName"].Value<string>();
    // 调用其他语言写的接口
    return Ok();
}

注意事项

  1. Content-Type头 :确保前端设置了正确的Content-Type(通常为application/json

  2. 模型绑定:确保你的模型类属性与前端发送的数据键名匹配

  3. 大小写敏感性默认情况下.NET Core使用驼峰命名解析,可以通过配置改变:

    复制代码
    services.AddControllers()
        .AddJsonOptions(options => 
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = null; // 保持原样
        });
  4. 异步读取:如果手动读取Request.Body,请确保使用异步方法

  5. 启用请求体缓冲:如果需要多次读取请求体,需要启用缓冲:

    复制代码
        // 启用缓冲(如果还没有启用)
        Request.EnableBuffering();
        
        // 获取原始请求体,在读取后总是重置 Request.Body.Position = 0,否则后续读取会得到空内容
        Request.Body.Position = 0;
相关推荐
葬歌倾城7 小时前
JSON的缩进格式方式和紧凑格式方式
c#·json
Eiceblue9 小时前
使用 C# 发送电子邮件(支持普通文本、HTML 和附件)
开发语言·c#·html·visual studio
小小小小王王王9 小时前
hello判断
开发语言·c#
金增辉11 小时前
基于C#的OPCServer应用开发,引用WtOPCSvr.dll
c#
future141213 小时前
C#学习日记
开发语言·学习·c#
傻啦嘿哟14 小时前
Python 办公实战:用 python-docx 自动生成 Word 文档
开发语言·c#
deriva15 小时前
.netcore+ef+redis+rabbitmq+dotcap先同步后异步再同步的方法,亲测有效
redis·rabbitmq·.netcore
唐青枫19 小时前
C#.NET log4net 详解
c#·.net
Nemo_XP1 天前
HttpHelper类处理两种HTTP POST请求
c#
lijingguang1 天前
在C#中根据URL下载文件并保存到本地,可以使用以下方法(推荐使用现代异步方式)
开发语言·c#