我服务器用php做了一个web service,使用SoapDiscovery.class.php生成的WSDL,生成了WSDL文件之后将soap address指向如下显示的这个文件,<?php
ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache
require ('./ServerSys.class.php');
$soap = new SoapServer('ServerSys.wsdl');
$soap -> setClass("ServerSys");
$soap -> handle();
?>其中ServerSys.class.php实现了一个根据输入的字符串返回不同的ID的功能,他会return一个字符串。
客户端是vs里面C#写的,通过vs添加service reference,然后引用,用其中一个函数来举例吧。现在的问题是我把这些东西放在自己本地的xampp搭的服务器上就一切正常。
可是放到我申请的万网服务器上后返回的xml内容就会固定在开头多出一个方框字符,另一个class的返回内容则是固定多出三个方框,如图所示忽略第一行那个服务器未响应的提示,那是我输出着玩的。可以看到最低下那里S开头的一串字符,服务器已经给出了正确的返回值,但是整个报文开头多了一个方块,导致无法解析xml,希望有经验的朋友能帮帮忙。

解决方案 »

  1.   

    另外补充一下我已经确保所有文件都是utf-8格式的了
      

  2.   

    是的,你 已经确保所有文件都是utf-8格式的了
    但你并没有确保所有文件都没有 BOM 头
    <?xml 前面的小方块显然是 BOM 头
      

  3.   


    额,其实我很想知道文件的格式会否影响到到回复的内容,因为在我想来我的C#程序收到的应该是一个serialized的xml文件,这个xml文件应该是由这个SoapServer生成的,那么它其实和我的php文件是用什么格式保存的应该没关系吧。或者如果不求甚解的话能提示一下如何解决收到的回复包含BOM头的问题呢?因为这个解析的过程是C#提供的函数解析的,我似乎无法干预的样子。还有我用php写了一个测试这个web service的小程序,就没有这个问题了,一切正常。
      

  4.   

    有可能的话,你可将 url 告诉我
    这样空对空的讨论实在是不能解决问题的
      

  5.   


    倒是无所谓,反正我现在还在开发中,web service地址是http://try.lygfengwei.com/php/soap/ServerSys.wsdl我的php测试程序如下
    <?php
    $client = new SoapClient('http://try.lygfengwei.com/php/soap/ServerSys.wsdl');
    $arr[] = 'shop';
    echo $ret = $client->__call('getID',$arr);visual studio版本是2015rc,现在的情况是php的soap client可以正常解析返回的内容,而vs的c#程序就不行。我使用vs的方式是在工程中添加service reference,然后直接引用。
      

  6.   

    拜托你把 BOM 头去掉好吧?
    $u = 'http://try.lygfengwei.com/php/soap/ServerSys.wsdl';
    $s = file_get_contents($u);
    echo bin2hex($s);efbbbf3c3f786d6c2076657273696f6e3d22312e3022203f3e0a3c64......这个 efbbbf 就是 BOM 头呀!