4

ウィザードを使用してVisualStudioでC#アプリケーションにインポートできるSOAPサーバーをZF2アプリケーションで作成しようとしています。私はすでにサービスを作成し、soapUIを使用してテストしました。私はsoapUIでWS-Iコンプライアンステストを実行し、サービスはそれに合格しました。ただし、Visual C#Express 2008を使用してサービスをC#アプリケーションに追加しようとすると、HTMLドキュメントにWebサービス検出情報が含まれていないと表示されます。

ZF2コントローラーで使用しているコードは次のとおりです。

public function exampleAction() {
  if (isset($_GET['wsdl'])) {
    $soapAutoDiscover = new AutoDiscover();
    $soapAutoDiscover->setBindingStyle(array('style' => 'document'));
    $soapAutoDiscover->setOperationBodyStyle(array('use' => 'literal'));
    $soapAutoDiscover->setClass('SoapClass');
    $soapAutoDiscover->setUri($serverUrl);
    echo $soapAutoDiscover->generate()->toXml();
  } else {
    $soap = new Server($serverUrl . '?wsdl');
    $soap->setClass('SoapClass');
    $soap->handle();
  }
}

これはSoapClassクラスです。

class SoapClass{

  /**
   * returns the sum of two parameters
   * @param int $a
   * @param int $b
   * @return int
   */
  public function sum ($a, $b){
    return $a + $b;
  }

  /**
   * twice function doc
   * @param int $a
   * @return int
   */
  public function twice($a){
    return $a * 2;
  }
}

何か案は?

4

3 に答える 3

4

私がこれで見つけたいくつかの投稿とドキュメントを何度も何度も読んで再読した後、最終的に解決策に出くわしました:

SoapClassは問題ありませんが、wsdlとサーバーを生成する時点で、いくつかの変更を加える必要がありました。

public function exampleAction() {
  if (isset($_GET['wsdl'])) {
    //this is new:
    $soapAutoDiscover = new AutoDiscover(new \Zend\Soap\Wsdl\ComplexTypeStrategy\ArrayOfTypeSequence());
    $soapAutoDiscover->setBindingStyle(array('style' => 'document'));
    $soapAutoDiscover->setOperationBodyStyle(array('use' => 'literal'));
    $soapAutoDiscover->setClass('SoapClass');
    $soapAutoDiscover->setUri($serverUrl);
    //so this is:
    header("Content-Type: text/xml");
    echo $soapAutoDiscover->generate()->toXml();
  } else {
    $soap = new Server($serverUrl . '?wsdl');
    //drop this:
    //$soap->setClass('SoapClass');
    //and instead, add this:
    $soap->setObject(new DocumentLiteralWrapper(new SoapClass()));
    $soap->handle();
  }
}
于 2012-11-27T22:53:20.863 に答える
2

トランスポートを指定する必要があると思います。

$style = array('style'=>'document', 'transport'=>'http://schemas.xmlsoap.org/soap/http');
$soapAutoDiscover->setBindingStyle($style);

そして、ヘッダーは次のようになります。

header('Content-type: application/soap+xml');
于 2014-02-17T21:57:42.873 に答える
0

ここでは、ZFSOAPコンポーネントの互換性に関するいくつかの問題について読むことができます。

http://framework.zend.com/issues/browse/ZF-6349

于 2014-02-21T21:50:27.603 に答える