在.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;
相关推荐
z落落3 小时前
C# 类与对象、字段、静态与非静态+四大访问修饰符
开发语言·c#
魔法阵维护师3 小时前
从零开发游戏需要学习的c#模块,第三十二章(Boss 战系统)
学习·游戏·c#
魔法阵维护师4 小时前
从零开发游戏需要学习的c#模块,第三十三章(暂停菜单)
学习·游戏·c#
z落落5 小时前
C# Stack栈 / Queue队列+所有集合 终极一页汇总(全覆盖、零遗漏)
java·开发语言·c#
淡海水6 小时前
08-认知篇-对比-injectfix深度解析
unity·c#·热更新·clr·hybrid·injectfix
周杰伦fans15 小时前
C# 踩坑 CS8370:Switch Expression 在 C# 7.3 不可用及三种解决方案
c#
z落落17 小时前
C# ToCharArray + foreach遍历 + String与StringBuilder
开发语言·c#
xiaoshuaishuai818 小时前
C# AvaloniaUI动态显示图片
开发语言·c#
csdn_aspnet21 小时前
EasyModbus 与 C# 集成
c#·modbus·easymodbus