从PHP发送字节数组到WCF

我必须从我的PHP客户端向WCF主机发送一个字节数组(编码的照片)。 当我在PHP中对我的数组执行var_dump()时,我得到一个数组[2839],这是正常的,但在服务器端调试时我看到接收到的数组只是字节[5] …我知道如何修复它?

我用这样的代码

$file = file_get_contents($_FILES['Filedata']['tmp_name']); $byteArr = str_split($file); foreach ($byteArr as $key=>$val) { $byteArr[$key] = ord($val); } $client = new SoapClient('http://localhost:8000/MgrService?wsdl', array( 'location' => 'http://localhost:8000/MgrService/SOAP11', 'trace' => true, 'soap_version' => SOAP_1_1 )); $par1->profileId = 13; $par1->photo = $byteArr; $client->TestByte($par1); 

正如我之前在wcf主机上写的那样,我只获得了字节[5]:/也许它需要一些解码来对肥皂序列化? 我应该使用Base64解码吗?

一般我只想将发布的文件上传到c#函数,其中byte []作为参数:/ Help

哦,这个函数的wsdl部分看起来像这样

        

您应该在PHP中使用字符串来模拟字节数组。 您甚至可以将语法$str[index]与字符串一起使用。 您有一个巨大的开销(4x或8x,具体取决于有效负载PLUS哈希表开销的int大小)否则。

我不太熟悉SOAP扩展所做的类型转换,但是使用字符串可能会起作用。

编辑:刚检查了来源:

 if (Z_TYPE_P(data) == IS_STRING) { str = php_base64_encode((unsigned char*)Z_STRVAL_P(data), Z_STRLEN_P(data), &str_len); text = xmlNewTextLen(str, str_len); xmlAddChild(ret, text); efree(str); } 

所以它已经为你做了base 64编码。

编辑2:[推测]

您的5字节长结果是因为转换为上面代码后面的字符串:

 if (Z_TYPE_P(data) == IS_STRING) { ... } else { zval tmp = *data; zval_copy_ctor(&tmp); convert_to_string(&tmp); str = php_base64_encode((unsigned char*)Z_STRVAL(tmp), Z_STRLEN(tmp), &str_len); text = xmlNewTextLen(str, str_len); xmlAddChild(ret, text); efree(str); zval_dtor(&tmp); } 

转换结果为“Array”,长度为5个字节。