调用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
相关产品推荐
相关产品推荐

