PHP调用C# ASP.NET WebMethod报错及参数为空问题求解
问题原因及解决方案
第一版调用报错原因
ASP.NET .asmx 服务的 WebMethod 不支持 static 修饰符,加了static的方法不会被暴露为SOAP服务接口,因此PHP端会报Function ("VerifyUser") is not a valid method for this service错误。
第二版参数为空的核心原因
你在调用__soapCall时参数结构不符合ASP.NET WebMethod的接收要求:
ASP.NET WebMethod接收SOAP参数时,要求传入的参数数组必须以方法定义的参数名作为外层键,你直接把clsUser的属性数组传入,服务端无法匹配到对应参数,因此识别为null。
具体解决步骤
1. 确认C#端配置合规
clsUser类必须标记为可序列化,所有需要传值的属性为公共可读写,且属性名和PHP传入的键名大小写完全匹配:
[Serializable] public class clsUser { // 注意属性名xxx要和PHP传的键名完全一致 public string xxx { get; set; } // 其他属性按实际需求补充 }
WebMethod不要加static修饰符,保持你第二版的写法即可。
2. 修改PHP端参数结构
调用__soapCall时,需要把参数内容包裹在对应参数名的键下,修改方式如下:
// 外层键为C#方法定义的参数名clsUser,内层是类的属性 $params = array( 'clsUser' => array( 'xxx' => 'xxx' // 其他属性对应补充 ) ); $urlWebService = "xxx.asmx?WSDL"; $response = WebSoapClient("VerifyUser", $urlWebService, $params);
3. 调试排查(可选)
如果修改后还是有问题,可以开启SOAP的trace模式,查看实际发送的请求报文,确认参数结构是否正确:
function WebSoapClient($function ,$url, $data = array() ) { $response = null; try { // 开启trace模式方便调试 $client = new SoapClient($url, array('trace' => 1, 'exceptions' => 1)); $response = $client->__soapCall( $function, $data ); // 调试时取消注释打印请求报文,确认参数结构 // var_dump($client->__getLastRequest()); } catch (Exception $e) { ErrorLog("WebSoapClient->". $function . " - " . $e->getMessage()); } return $response; }
内容的提问来源于stack exchange,提问作者Jing Suan
相关产品推荐
相关产品推荐

