在.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;
相关推荐
晨星shine3 天前
GC、Dispose、Unmanaged Resource 和 Managed Resource
后端·c#
用户298698530144 天前
.NET 文档自动化:Spire.Doc 设置奇偶页页眉/页脚的最佳实践
后端·c#·.net
用户3667462526744 天前
接口文档汇总 - 2.设备状态管理
c#
用户3667462526744 天前
接口文档汇总 - 3.PLC通信管理
c#
Ray Liang4 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Scout-leaf7 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
用户298698530148 天前
程序员效率工具:Spire.Doc如何助你一键搞定Word表格排版
后端·c#·.net
mudtools9 天前
搭建一套.net下能落地的飞书考勤系统
后端·c#·.net
玩泥巴的9 天前
搭建一套.net下能落地的飞书考勤系统
c#·.net·二次开发·飞书
唐宋元明清21889 天前
.NET 本地Db数据库-技术方案选型
windows·c#