C# ASMX WebService接收JSON问题:PHP发送JSON为空原因排查
问题排查与解决思路
这问题我之前帮同事排查过类似的,ASMX WebService对请求格式的要求确实比较严格——虽然你能在error.txt里看到完整的JSON,但服务端接收为NULL,大概率是请求头、编码或者服务端配置的问题,给你分几个方向逐一排查:
1. 检查PHP请求的Content-Type头
ASMX默认只识别application/json类型的请求体来自动解析JSON数据,而PHP的CURL如果不手动设置,默认会发送application/x-www-form-urlencoded的请求头,这时候服务端根本不会把请求体当成JSON来解析,自然得到NULL。
解决办法是在PHP的CURL请求里添加正确的HTTP头:
$ch = curl_init($webservice_url); // 设置为POST请求 curl_setopt($ch, CURLOPT_POST, true); // 传入JSON格式的请求体 curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); // 关键:指定请求内容类型为JSON,编码为UTF-8 curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charset=utf-8', 'Accept: application/json' )); // 执行请求并获取响应 $response = curl_exec($ch); curl_close($ch);
2. 确认JSON数据的编码与格式
虽然error.txt里的JSON看起来完整,但要确保PHP生成和发送的JSON是标准UTF-8编码:
- 用
json_encode生成JSON时,建议加上JSON_UNESCAPED_UNICODE参数(即使你的内容都是英文/数字,也能避免潜在的编码转义问题):$data = array( 'results' => array( array('msgId' => '001', 'to' => '9665312114', 'status' => 'D'), // 其他数据项... ) ); $json_data = json_encode($data, JSON_UNESCAPED_UNICODE); - 绝对不要对JSON字符串做额外的URL编码或转义,直接发送原始字符串即可。
3. 检查ASMX WebService的配置与方法定义
确保你的WebService已经正确配置支持JSON接收:
- 在Web.config中启用HTTP POST协议:
<system.web> <webServices> <protocols> <add name="HttpPost"/> </protocols> </webServices> </system.web> - WebMethod要添加必要的特性,指定支持JSON格式:
划重点:using System.Web.Services; using System.Web.Script.Services; using System.Collections.Generic; // 定义与JSON结构对应的实体类 public class ResultItem { public string msgId { get; set; } public string to { get; set; } public string status { get; set; } } public class RequestPayload { public List<ResultItem> results { get; set; } } [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ScriptService] // 必须添加这个特性才能处理JSON请求 public class YourWebService : WebService { [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = false)] public string InsertData(RequestPayload payload) { // 这里payload就应该能正常接收PHP发送的JSON数据了 if (payload?.results != null) { // 执行数据库插入逻辑 return "Success"; } return "Failed: Null data received"; } }[ScriptService]特性是ASMX支持JSON请求的核心,千万不能漏加。
4. 对比ASPX AJAX与PHP请求的差异
你可以用Fiddler或者浏览器开发者工具,分别抓取ASPX AJAX和PHP发送的请求,对比两者的:
- 请求头(尤其是Content-Type、Accept字段)
- 请求体的原始内容与编码
- HTTP方法(是否都是POST?)
找到差异后调整PHP的请求,和ASPX的请求保持一致,基本就能解决问题。
内容的提问来源于stack exchange,提问作者Abdullah Al-Mohammadi
相关产品推荐
相关产品推荐

