2016-10-05 1 views
0

Я сделал Laravel с NuSOAP WebService, который прекрасно работает во всех средах для .NET решений, кроме ...NuSOAP ошибка WebService с .NET решения

# PHP/app/Http/route.php

$app->group(['prefix' => 'test', 'namespace' => 'App\Http\Controllers'], function() use ($app) { 

    $app->get('/', '[email protected]'); 
    $app->get('/{any}', '[email protected]'); 
    $app->post('/', '[email protected]'); 
    $app->post('/{any}', '[email protected]'); 

}); 

# PHP/app/Http/Controllers/TestController.php

<?php namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use App\Models\Common; 
use SoapBox\Formatter\Formatter; 

class TestController extends Controller 
{ 
    public function __construct() 
    { 
     $this->server = new \soap_server; 
     $end_point = env('END_POINT') . '/test/wsdl'; 
     $this->server->configureWSDL('test', 'urn:test', $end_point, 'rpc'); 

     $this->server->register(
      'testMethod', 
      [ 
       'one' => 'xsd:string', 
       'two' => 'xsd:string', 
      ], 
      [ 
       'return' => 'xsd:array' 
      ], 
      'urn:testWSDL', 
      'urn:testWSDL#testMethod', 
      'rpc', 
      'encoded', 
      'Test Method' 
     ); 
    } 

    function index(Request $request, $data = NULL) 
    { 
     $_SERVER['QUERY_STRING'] = ''; 
     if ($request->segment(2) == 'wsdl') $_SERVER['QUERY_STRING'] = 'wsdl'; 
     return $this->server->service(file_get_contents('php://input')); 
    } 
} 

# PHP /app/Http/helpers.php

<?php use SoapBox\Formatter\Formatter; 

function arrayToXml($array, $remove_structure = TRUE) { 

    $array = Formatter::make($array, Formatter::ARR); 

    $ret = $array->toXml(); 

    if ($remove_structure) 
    { 
     $ret = str_replace('<?xml version="1.0" encoding="utf-8"?>', '', $ret); 
     $ret = str_replace('<xml>', '', $ret); 
     $ret = str_replace('</xml>', '', $ret); 
    } 

    return trim($ret); 
} 

function testMethod($one, $two) 
{ 
    return arrayToXml([ 
     "one" => $one, 
     "two" => $two 
    ]); 
} 

Если я пытаюсь с SoapGUI, я посылаю:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:testWSDL"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <urn:testMethod soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
     <one xsi:type="xsd:string">first</one> 
     <two xsi:type="xsd:string">second</two> 
     </urn:testMethod> 
    </soapenv:Body> 
</soapenv:Envelope> 

И я получаю ...

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
     <ns1:testMethodResponse xmlns:ns1="urn:testWSDL"> 
     <return xsi:type="xsd:array"> 
      <one>first</one> 
      <two>second</two> 
     </return> 
     </ns1:testMethodResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Исходный ответ:

HTTP/1.0 200 OK 
Date: Tue, 02 Oct 2016 13:26:14 GMT 
Server: Apache/2.4.18 (Unix) PHP/5.5.36 LibreSSL/2.2.7 
X-Powered-By: PHP/5.5.36 
X-SOAP-Server: NuSOAP/0.9.5 (1.56) 
Content-Length: 537 
Cache-Control: no-cache 
Connection: close 
Content-Type: text/xml; charset=UTF-8 

<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:testMethodResponse xmlns:ns1="urn:testWSDL"><return xsi:type="xsd:array"><one>first</one><two>second</two></return></ns1:testMethodResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> 

Я пытался в soapclient.com/soaptest.html тоже и работает просто отлично ... Но в .NET решение ... я добавляю его в качестве Web Reference:

enter image description here

Тогда добавить следующий код ... и я получаю IntelliSense ...

first param...

second param...

Затем нажмите на кнопку Click Me и получите эту ошибку:

Первый шанс исключение типа 'System.InvalidOperationException' произошло в system.Xml.dll System.InvalidOperationException: Ошибка ан-эль Documento XML (1, 479) , ---> System.InvalidCastException: Нет se puede asignar el objeto de tipo System.Xml.XmlNode [] al objeto de tipo System.String. ан Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReadertest.Read2_testMethodResponse() ан Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer3.Deserialize (XmlSerializationReader читатель) ан System.Xml.Serialization.XmlSerializer.Deserialize (XmlReader XmlReader, струнного encodingStyle, XmlDeserializationEvents события) --- Fin дель seguimiento-де-ла-де-ла Pila excepción интерна --- ан System.Xml.Serialization.XmlSerializer.Deserialize (XmlReader XmlReader, струнного encodingStyle, XmlDeserializationEvents события) ан System.Xml.Serialization.XmlSerializer .Deserialize (XmlReader xmlReader, String encodingStyle) ru System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse (сообщение SoapClientMessage, ответ WebResponse, Stream responseSt ream, Boolean asyncCall) ru System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke (параметры String methodName, Object []) ru testingSolution.local31.test.testMethod (String one, String two) ru C: \ Documents and Settings \ admin \ Mis documentos \ testingSolution \ Веб-ссылки \ local31 \ Reference.vb: línea 80 ru testingSolution.Testeos.Button3_Click (отправитель объекта, EventArgs e) ru C: \ Documents and Settings \ admin \ Mis documentos \ testingSolution \ index.vb: línea 50

Если я изменяю тип возвращаемого значения на строку ... В .NET-решении я получаю : enter image description here

Но в SoapGUI (и всех остальных приложений):

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
     <ns1:testMethodResponse xmlns:ns1="urn:testWSDL"> 
     <return xsi:type="xsd:string">&lt;one>mundo&lt;/one>&lt;two>aunque&lt;/two></return> 
     </ns1:testMethodResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Что я могу сделать, чтобы решить эту проблему? потому что мне нужно вернуть массив. Благодаря!

ответ

0

Наконец это было только это:

// whether $methodreturn is a string of literal XML 
$this->server->methodreturnisliteralxml = true; 

Источник: PHP NuSOAP response