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

发布于:2025-06-08 ⋅ 阅读:(16) ⋅ 点赞:(0)

.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;


网站公告

今日签到

点亮在社区的每一天
去签到