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

调用C# WebMethod时遇JSON反序列化错误:System.String无参构造函数未定义

解决JSON反序列化时的"No parameterless constructor defined for type of 'System.String'"错误

嘿,这个问题我太熟了!之前做ASP.NET项目的时候踩过一模一样的坑,咱们来快速搞定它。

为什么会出现这个错误?

这个报错本质是ASP.NET的WebMethod在尝试解析你的AJAX请求参数时,没法正确把请求内容转换成你定义的string param参数。核心问题出在请求的参数格式和WebMethod的期望不匹配:

  • 你用了GET请求,但可能直接传递了JSON对象而非字符串;
  • 即便用POST,没设置正确的contentType,导致服务器用错误的方式解析参数;
  • 参数的结构没有和WebMethod的参数名对应上。

直接上解决方案(推荐用POST,更稳定)

第一步:修正JavaScript的AJAX请求

把你的AJAX代码改成这样,注意几个关键细节:

$.ajax({
    type: 'POST',
    // 替换成你的ASPX页面路径,比如"Default.aspx/insertValues"
    url: 'YourPage.aspx/insertValues',
    // 必须设置这个 contentType,告诉服务器我们传的是JSON格式
    contentType: 'application/json; charset=utf-8',
    // 把数据da转成JSON字符串,再包装成和WebMethod参数名匹配的结构
    data: JSON.stringify({ param: JSON.stringify(da) }),
    dataType: 'json',
    success: function(response) {
        // WebMethod的返回值会被包装在response.d里,这是ASP.NET的特性
        console.log("返回结果:", response.d);
        alert("操作完成:" + response.d);
    },
    error: function(xhr, status, error) {
        console.error("请求出错了:", error);
    }
});

第二步:确认C#代码无需修改(如果用POST)

你的C#代码本身没问题,只要确保参数名param和JS里的参数名完全一致就行:

using System.Web.Services;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

[WebMethod]
public static string insertValues(string param) {
    JObject data = JObject.Parse(param);
    // 这里写你的数据处理逻辑
    return "finished";
}

如果一定要用GET请求怎么办?

如果业务需求必须用GET,需要做两个修改:

1. 给WebMethod添加允许GET的特性

先引用System.Web.Script.Services命名空间,然后加上[ScriptMethod(UseHttpGet = true)]:

using System.Web.Services;
using System.Web.Script.Services; // 新增这个引用
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

[WebMethod]
[ScriptMethod(UseHttpGet = true)] // 允许GET请求访问这个WebMethod
public static string insertValues(string param) {
    JObject data = JObject.Parse(param);
    // 数据处理逻辑
    return "finished";
}

2. 修正AJAX的GET请求代码

把JSON对象转成字符串作为查询参数传递:

$.ajax({
    type: 'GET',
    url: 'YourPage.aspx/insertValues',
    // 把da转成JSON字符串,作为param参数的值
    data: { param: JSON.stringify(da) },
    dataType: 'json',
    success: function(response) {
        console.log("返回结果:", response.d);
    },
    error: function(xhr, status, error) {
        console.error("请求出错:", error);
    }
});

几个容易踩的小坑提醒

  • 参数名大小写敏感:JS里的param必须和C#里的param完全一致,大小写都不能错;
  • 不要直接传JSON对象:必须用JSON.stringify()把数据转成字符串,否则服务器没法解析成string类型;
  • POST必须加contentType:如果没设置application/json,服务器会默认用表单格式解析,直接导致反序列化失败;
  • 返回值在response.d里:ASP.NET会把WebMethod的返回值包装在response.d属性里,别直接取response本身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:26:05