2

問題:

Yiiが石鹸のバージョンを変更することをどのように期待しているか理解できません。私はこのチュートリアルに従っています。Webサービスは機能しますが、SOAP1.2ではありません

クラス:

<?php
class ABFolioController extends CController
{
    public function actions()
    {
        return array(
            'folio'=>array(
                'class'=>'CWebServiceAction',
                'serviceOptions'=>array('soapVersion'=>'1.2')
            ),
        );

    }

    /**
     * @param  string folioId
     * @param  string cNumber
     * @param  string oDRS
     * @param  string dlr
     * @param  string feeAmount
     * @param  string transactionStatus
     * @param  string captureId
     * @param  datetime captureTimestamp
     * @param  string prefix
     * @param  string oDEFRS
     * @return string the statement
     * @soap
     */
    public function sendFolio($folioId, $cNumber, $oDRS, $dlr,
            $feeAmount, $transactionStatus, $captureId, $captureTimestamp, 
            $prefix, $oDEFRS)
    {
    //

      $model = new Dlfolio();
      $model->folioId = $folioId;
      $model->cNumber = $cNumber;
      $model->oDRS = $oDRS;
      $model->dlr = $dlr;
      $model->feeAmount = $feeAmount;
      $model->transactionStatus = $transactionStatus;
      $model->captureId = $captureId;
      $model->captureTimestamp = $captureTimestamp;
      $model->prefix = $prefix;
      $model->oDEFRS = $oDEFRS;
      $yesno = $model->save();

      if ($yesno=TRUE)
      {
          //on success
          return 'Record Saved';
      }
      else
      {
          //on failure
          return $yesno;
      }

    }   
}
4

1 に答える 1

4

クライアントを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>

addBindingsyiiinとbuildDOM関数の同じファイルで実行できるすべての置換

また、私はそれがはるかに難しいと思います。つまり、両方をサポートしたい場合は、soapとsoap12の両方のバインディングが必要ですが、少なくとも、soap12としてすでに認識されています。

EDIT:

独自のwsdlを提供しない場合はyiiハードコードされたsoap1.1(CWebServiceのrunメソッドのように$ wsdlUrlを介して提供できます)。それは合法のようです-phpSOAPサーバーのデフォルトのSOAPバージョンも1.1であるため、バージョンを1.2に変更する場合は、1.2用に独自のWSDLを提供する必要があります

于 2012-04-24T10:14:30.743 に答える