在.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;
相关推荐
葛小白19 小时前
C#进阶13:C#全局路径规划算法_A*
c#·路径规划算法·astar算法
时光追逐者12 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 61 期(2025年11.10-11.16)
c#·.net·.netcore
世洋Blog14 小时前
Unity面经-List底层原理、如何基于数组、如何扩容、List存储泛型、List有关在内存中的结构
unity·面试·c#·list
PfCoder15 小时前
C# async / await 用法以及和Task的关系
c#·多线程·winform·async、await
唐青枫18 小时前
.NET Web 应用 Linux 部署全指南:从环境搭建到生产上线
c#·.net
Charles_go1 天前
41、C#什么是单例设计模式
java·设计模式·c#
夏霞1 天前
c# ASP.NET Core SignalR 客户端与服务端自动重连配置指南
开发语言·c#·asp.net
Scout-leaf1 天前
九成九新自用C#入门文档
c#