从PHP发送字节数组到WCF

时间:2010-06-06 22:22:57

标签: c# php wcf soap soa

我必须从我的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部分看起来像这个

<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>

1 个答案:

答案 0 :(得分:1)

您应该在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编码。

EDIT2:[推测]

您的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个字节。