クライアントをv1.2に設定すると、常にサーバーからv1.2応答を受信し、クライアントをv1.1に設定すると、常にサーバーからv1.1応答を受信します。おそらく、クライアントのバージョンを自動検出してオーバーライドします。それを備えたサーバーバージョン?
$client=new SoapClient('http://hys.local/ABFolio/folio',array('soap_version'=>SOAP_1_2,'trace'=>true));
var_dump($client);
echo $client->sendFolio();
echo $client->__getLastRequest();
echo $client->__getLastResponse();
応答は1.2です
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"
クライアントのデフォルトは1.1です。
$client=new SoapClient('http://hys.local/ABFolio/folio',array('soap_version'=>SOAP_1_1,'trace'=>true));
応答は1.1です
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
EDIT:
yiiの中を見てみましょう
framework\web\services\CWebService.php
/**
* @return array options for creating SoapServer instance
* @see http://www.php.net/manual/en/function.soap-soapserver-construct.php
*/
protected function getOptions()
{
$options=array();
if($this->soapVersion==='1.1')
$options['soap_version']=SOAP_1_1;
else if($this->soapVersion==='1.2')
$options['soap_version']=SOAP_1_2;
if($this->actor!==null)
$options['actor']=$this->actor;
$options['encoding']=$this->encoding;
foreach($this->classMap as $type=>$className)
{
$className=Yii::import($className,true);
if(is_int($type))
$type=$className;
$options['classmap'][$type]=$className;
}
return $options;
}
このコードをチェックしても、コードにエラーは表示されません
EDIT:
わかりました、これはどうですか?framework\web\services\CWsdlGenerator.php
/*
* @param DOMDocument $dom Represents an entire HTML or XML document; serves as the root of the document tree
*/
private function addBindings($dom)
{
$binding=$dom->createElement('wsdl:binding');
$binding->setAttribute('name',$this->serviceName.'Binding');
$binding->setAttribute('type','tns:'.$this->serviceName.'PortType');
$soapBinding=$dom->createElement('soap:binding');
$soapBinding->setAttribute('style','rpc');
$soapBinding->setAttribute('transport','http://schemas.xmlsoap.org/soap/http');
$binding->appendChild($soapBinding);
$dom->documentElement->appendChild($binding);
foreach($this->_operations as $name=>$doc)
$binding->appendChild($this->createOperationElement($dom,$name));
}
トランスポートが事前定義されていることがわかります(確認して12に置き換えることができます)
私のwsdlは12を追加するとこれになります
<wsdl:binding name="ABFolioControllerBinding" type="tns:ABFolioControllerPortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap12/http"/>
</wsdl:binding>
多分それはyiiのバグです-先に進んでそれを報告してください
しかし、http://msdn.microsoft.com/en-us/library/ms995800.aspx
私はトランスポートではなく名前空間をチェックしていたので
SOAP versioning is based on XML namespaces. SOAP 1.1 is identified by the http://schemas.xmlsoap.org/soap/envelope/ namespace while SOAP 1.2 is identified by the http://www.w3.org/2002/12/soap-envelope namespace (although this will change when it becomes a Recommendation).
だから私はすべてが正しいと思った
EDIT:
ここに決定があります、あなたは持っている必要があります
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
<definitions
に加えてあなたのxmlの中に
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
そしてこれの代わりに:
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
あなたが配置する必要があります
<soap12:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
これで、soapUIは私のwsdlをsoap1.2として検出します
<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="urn:ABFolioControllerwsdl"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
name="ABFolioController"
targetNamespace="urn:ABFolioControllerwsdl">
<wsdl:portType name="ABFolioControllerPortType"/>
<wsdl:binding name="ABFolioControllerBinding" type="tns:ABFolioControllerPortType">
<soap12:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
</wsdl:binding>
<wsdl:service name="ABFolioControllerService">
<wsdl:port name="ABFolioControllerPort" binding="tns:ABFolioControllerBinding">
<soap:address location="http://hys.local/uk/aBFolio/folio?ws=1"/>
</wsdl:port>
</wsdl:service>
</definitions>
addBindings
yiiinとbuildDOM
関数の同じファイルで実行できるすべての置換
また、私はそれがはるかに難しいと思います。つまり、両方をサポートしたい場合は、soapとsoap12の両方のバインディングが必要ですが、少なくとも、soap12としてすでに認識されています。
EDIT:
独自のwsdlを提供しない場合はyiiハードコードされたsoap1.1(CWebServiceのrunメソッドのように$ wsdlUrlを介して提供できます)。それは合法のようです-phpSOAPサーバーのデフォルトのSOAPバージョンも1.1であるため、バージョンを1.2に変更する場合は、1.2用に独自のWSDLを提供する必要があります