我必须从我的 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 主机上写的那样,我只得到 byte[5] :/也许它需要一些解码来正确的 soap 序列化?我应该使用 Base64 解码还是什么?
一般我只想将发布的文件上传到 c# 函数,使用 byte[] 作为参数:/帮助
哦,这个函数的 wsdl 部分看起来像这样
<xs:element name="TestByte">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="photo" nillable="true" type="xs:base64Binary"/>
</xs:sequence>
</xs:complexType>
</xs:element>
最佳答案
您应该在 PHP 中使用字符串来模拟字节数组。您甚至可以对字符串使用语法 $str[index]
。否则,您会有巨大的开销(4 倍或 8 倍,具体取决于负载的 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);
}
转换结果为“数组”,长度为 5 个字节。
关于c# - 将字节数组从 PHP 发送到 WCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2986151/