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

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接收:

  1. 在Web.config中启用HTTP POST协议:
    <system.web>
      <webServices>
        <protocols>
          <add name="HttpPost"/>
        </protocols>
      </webServices>
    </system.web>
    
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:42:24