C#调用接口JSON反序列化失败 提示未知web方法addEditTickets
问题定位结论
- 报错
Unexpected character encountered while parsing value: <. Path '', line 0, position 0.和你提交的JSON请求参数格式没有任何关系,触发原因是服务端没有返回预期的JSON格式响应,而是返回了HTML格式的服务端错误页,HTML内容以<字符开头,不符合JSON语法规则,因此执行JsonConvert.DeserializeObject(res)时抛出解析错误。 - 你捕获到的响应内容已经明确了服务端的真实错误:
System.ArgumentException: Unknown web method addEditTickets. Parameter name: methodName,即当前请求的目标web方法addEditTickets不存在,服务端直接抛出了框架错误黄页。 - 你提供的请求JSON参数格式校验完全正确,不需要在参数格式上花费排查精力。
修复方案
- 核对请求地址拼接逻辑:检查配置项
links的基础地址、变量functionName的取值,确认拼接后的完整请求路径和服务端实际暴露的接口路径完全匹配,重点排查路径是否缺省后缀、大小写是否错误、路由规则是否匹配。 - 如果调用的是ASP.NET ASMX类型的web服务,需要确认服务端的
addEditTickets方法满足以下要求:- 方法添加了
[WebMethod]特性标记 - 方法访问修饰符为
public - 方法未做特殊访问限制
- 方法添加了
- 增加响应合法性校验逻辑,不要直接将响应内容反序列化为JSON,避免非JSON返回值触发解析报错,参考修正代码:
DataTable retOg = new DataTable(); var client = new RestClient(System.Configuration.ConfigurationManager.AppSettings["links"].ToString() + functionName); client.Timeout = -1; var request = new RestRequest(Method.POST); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", param, ParameterType.RequestBody); IRestResponse response = client.Execute(request); string res = response.Content; // 先校验响应格式再做JSON解析 if (response.IsSuccessful && !string.IsNullOrEmpty(res) && res.TrimStart().StartsWith("{")) { dynamic jsonResponse = JsonConvert.DeserializeObject(res); } else { // 此处可打日志记录原始响应内容,方便定位服务端错误 throw new Exception($"接口请求失败,服务端返回:{res}"); }
内容的提问来源于stack exchange,提问作者Noorin Ansari
相关产品推荐
相关产品推荐

