c# - 将字节数组从 PHP 发送到 WCF

标签 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 主机上写的那样,我只得到 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/

相关文章:

c# - 在Windows XP/Vista/Seven中获得GET Master音量(通常通过键盘滚轮增加音量)

c# - 如何结合 Reverse Poco Generator 使用 Effort

php - 使用 laravel dusk 测试新窗口

c# - 如何拦截来自 WCF 客户端的 header ...?

c# - 每种类型的最新记录?

c# - 在 Windows 应用商店应用程序中无需用户干预即可打印

php - Recaptcha 出现 Ajax 错误

php - 过滤和排序具有多个值的多维数组

wcf - 如何为WCF实现2路SSL证书

c# - 将 MaxReceivedMessageSize 属性放在 WCF 服务的 web.config 文件中的什么位置?