You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MVC5如何无需特定模型接收原始JSON作为Action参数

解决.NET MVC5接收通用JSON请求体的问题

你遇到的问题源于MVC5默认的模型绑定逻辑:在处理application/json类型请求时,通用类型(比如Object、JObject、string)的绑定规则不符合需求——用Object会得到空实例,用string或JObject则因绑定逻辑不匹配返回null。

下面是两种实用的解决方案:

方案1:直接读取请求体原始字符串(推荐,简单直接)

跳过模型绑定,直接从请求流中读取完整的原始JSON字符串,不受JSON结构限制:

[HttpPost]
public JsonResult LogUIAnalytics()
{
    string rawJson;
    // 重置请求流位置,避免因流已被读取导致获取空内容
    Request.InputStream.Position = 0;
    using (var reader = new StreamReader(Request.InputStream))
    {
        rawJson = reader.ReadToEnd();
    }
    log.Info("UserAnalytics:" + rawJson);
    
    // 如果后续需要解析JSON内容,可使用Newtonsoft.Json处理
    // var analyticsObj = JObject.Parse(rawJson);
    
    return Json(true);
}

方案2:自定义模型绑定器(适合多接口复用场景)

如果需要在多个接口中使用通用JSON字符串参数,可以自定义模型绑定器,让string类型直接绑定application/json请求体:

步骤1:创建自定义模型绑定器

public class RawJsonStringBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        request.InputStream.Position = 0;
        using (var reader = new StreamReader(request.InputStream))
        {
            return reader.ReadToEnd();
        }
    }
}

步骤2:在接口参数中使用绑定器

[HttpPost]
public JsonResult LogUIAnalytics([ModelBinder(typeof(RawJsonStringBinder))] string userAnalytics)
{
    log.Info("UserAnalytics:" + userAnalytics);
    return Json(true);
}

若要全局生效,在Global.asax的Application_Start方法中注册绑定器:

protected void Application_Start()
{
    // 其他配置代码...
    ModelBinders.Binders.Add(typeof(string), new RawJsonStringBinder());
}

内容的提问来源于stack exchange,提问作者Teja duggirala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:32:54