php xml转换成.net二进制格式


php xml to .NET binary format

有没有人试图连接到soap服务器,实现。net二进制编码(http://msdn.microsoft.com/en-us/library/cc219175.aspx)使用php curl或soapClient..当我尝试使用curl连接到url时,我总是收到400个错误请求,因为我需要将XML转换为。net二进制格式

谢谢…

的示例代码

soap_request美元= "

";
$url    = 'https://webapp.healthcaresynergy.com:8002/demoalpha/HealthCareServiceWCF.svc?singleWsdl';
$header = array(
'Content-type: application/soap+msbin1',
'Expect: ',
'SOAPAction: urn:HealthCareServiceWCF/Login',
'Content-length: '.strlen($soap_request),
  );
$ch = curl_init(); 
curl_setopt_array($ch , array( 
    CURLOPT_RETURNTRANSFER  => true,
    //CURLOPT_ENCODING        => 'gzip',
    CURLOPT_HEADER          => true,
    CURLOPT_FOLLOWLOCATION  => true,
    CURLOPT_USERAGENT       => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)',
    //CURLOPT_VERBOSE         => true,
    //CURLOPT_STDERR          => $verbose = fopen('php://temp', 'rw+'), 
    CURLOPT_URL             => $url ,
   CURLOPT_POSTFIELDS      => 1, 
    CURLOPT_POSTFIELDS      => $soap_request,
CURLOPT_HTTPHEADER      => $header ,
CURLOPT_CUSTOMREQUEST => 'POST'
));
$output = curl_exec($ch);
$info   = curl_getinfo($ch);
if($output === false)  {
    $err = 'Curl error: ' . curl_error($ch);
}  else { 
    echo 'Operation success';
} echo '<pre>';
print_r($info);
//echo "Verbose information:'n<pre>", !rewind($verbose),     htmlspecialchars(stream_get_contents($verbose)), "</pre>'n";
curl_close($ch);
$s = htmlspecialchars($output);
echo $s;

这让我想起了我们对MSNP (Windows Live Messenger)进行反向工程的时候。您需要将SOAP转换为它们的字节流格式。

这里有一个图书馆:

https://github.com/casperbiering/phpBinaryXml

更新:

已知/缺失的问题:

  • 只支持解码

愚蠢的我。我将留下答案,也许它是有帮助的,同时搜索编码库。

也许一个解决方法是为linux编译一个。net控制台程序或类似的程序,并将其用作包装器/转换器。

是的,说实话,它总是会失败的。

为什么?

嗯,在。net世界中,你强调的大多数类型的服务都是基于"SOAP"的。

就像任何基于soap的服务一样,如果你用'?wsdl'结束或常规get请求,您应该(如果写得正确)*获得返回的服务描述文档,该文档告诉您如何调用它。

这个"WSDL"文档,然后可以被任何像样的SOAP库解释,然后从该库中正确调用,而不需要使用工具和/或API(如Curl)求助于原始套接字调用。

。. NET的soap接口,像大多数soap实现一样,不是被设计为使用原始URL工具或裸露的HTTP请求调用的,协议开销太复杂了,不值得麻烦。

不要误会我的意思,但是,它是可能的我知道,因为我做过,这不是一个愉快的经历,我绝对不会推荐任何人走这条路,试图与这些服务之一交谈,除非你绝对没有其他选择。

如果你需要在Curl(或PHP Curl API)中使用一个简单的调用机制,那么我建议在。net端使用"通用处理程序",或者更新的ASP。. NET Web-API,所有这些都可以调整为返回您需要返回的数据,并且与更现代和流行的JSON格式一起工作得很好。

如果你有跨平台二进制数据交换的需求,它不仅在TCP/IP上工作得很好,而且在许多其他通道上,如串行,SMS,无线电等。

那么你可能要考虑"Google Proto Buffers"这些家伙的序列化是非常有效的,我在一个基于TCP的服务器定期在套接字和字节级别与基于SMS的移动设备通信的系统上工作。

这些移动设备,运行Windows CE,并且曾经有一个基于SOAP的微型端点,就像你所询问的那样,服务器服务使用从PHP到NodeJS的混合物,我们必须管理它们的维护工作是艰巨的。

自从我们改用Proto-Buf后,我们再也没有回头,在PHP上序列化它…在。net上反序列化没有问题。