2016-04-12 35 views
3

PHP ile SOAP hizmeti tüketmeye çalışırken garip bir problemim var. İsteğimi reddediyor ve son komutun sonucunu geri almaya devam ediyor! SOAP, bir genel IP uç noktasına işaret eden bir 'hatalı' wsdl'e sahip olan bir yazarkasa makinesinde bulunur ve bunu elle düzenlemek zorunda kaldım. Ben formları kullanarak C# bir istemci yaptıkPHP SOAP eski sonuçları döndürmeye devam ediyor

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://192.168.1.20/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://192.168.1.20/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:types> 
    <s:schema elementFormDefault="qualified" targetNamespace="http://192.168.1.20/"> 
     <s:element name="Cmd"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="1" maxOccurs="1" name="CmdText" type="s:string" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:element name="CmdResponse"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="1" maxOccurs="1" name="CmdReply" type="s:string" /> 
      <s:element minOccurs="1" maxOccurs="1" name="LcdLine1" type="s:string" /> 
      <s:element minOccurs="1" maxOccurs="1" name="LcdLine2" type="s:string" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:element name="GetAppStatus"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="1" maxOccurs="1" name="SerialNo" type="s:string" /> 
      <s:element minOccurs="1" maxOccurs="1" name="RetData"  type="s:string" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:element name="GetAppStatusResponse"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="1" maxOccurs="1" name="GetAppStatusResult" type="s:unsignedByte" /> 
      <s:element minOccurs="1" maxOccurs="1" name="RetData" type="s:string" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element>  
    </s:schema> 
    </wsdl:types> 
    <wsdl:message name="CmdSoapIn"> 
    <wsdl:part name="parameters" element="tns:Cmd" /> 
    </wsdl:message> 
    <wsdl:message name="CmdSoapOut"> 
    <wsdl:part name="parameters" element="tns:CmdResponse" /> 
    </wsdl:message> 
    <wsdl:message name="GetAppStatusSoapIn"> 
    <wsdl:part name="parameters" element="tns:GetAppStatus" /> 
    </wsdl:message> 
    <wsdl:message name="GetAppStatusSoapOut"> 
    <wsdl:part name="parameters" element="tns:GetAppStatusResponse" /> 
    </wsdl:message> 
    <wsdl:portType name="MyEcrResponceSoap"> 
    <wsdl:operation name="Cmd"> 
     <wsdl:input message="tns:CmdSoapIn" /> 
     <wsdl:output message="tns:CmdSoapOut" /> 
    </wsdl:operation> 
    <wsdl:operation name="GetAppStatus"> 
     <wsdl:input message="tns:GetAppStatusSoapIn" /> 
     <wsdl:output message="tns:GetAppStatusSoapOut" /> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="MyEcrResponceSoap" type="tns:MyEcrResponceSoap"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="Cmd"> 
     <soap:operation soapAction="http://192.168.1.20/Cmd" style="document" /> 
     <wsdl:input> 
     <soap:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    <wsdl:operation name="GetAppStatus"> 
     <soap:operation soapAction="http://192.168.1.20/GetAppStatus" style="document" /> 
     <wsdl:input> 
     <soap:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation>  
    </wsdl:binding> 
    <wsdl:service name="MyEcrResponce"> 
    <wsdl:port name="MyEcrResponceSoap" binding="tns:MyEcrResponceSoap"> 
     <soap:address location="http://192.168.1.20/MyEcrResponce/" /> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

: WSDL dosyası bunu indirdim ve '192.168.1.20' ile tüm yanlış IP başvuruları değiştirildi ve sonra MyEcrResponce.wsdl olarak yerel olarak kaydedilen hangi http://192.168.1.20/MyEcrResponce.wsdl içindedir , 192.168.1.20 kamu IP'den çözeltide tüm referansları yerini ve ince işler:

$client = new SoapClient(
dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MyEcrResponce.wsdl', 
array('location' => 'http://192.168.1.20/MyEcrResponce.cgx', 
    'login' => 'user', 
    'password' => 'pass', 
    'trace' => 0, 
    'cache_wsdl' => WSDL_CACHE_NONE)); 

$cmd = new StdClass(); 
$cmd->CmdText = 'a/'; 

var_dump($client->Cmd($cmd)); 

olursa olsun WHI:

private void button1_Click(object sender, EventArgs e) 
{ 
    string reply = ""; 
    string LcdMsg1 = ""; 
    string LcdMsg2 = ""; 

    Uri ur = new Uri("http://192.168.1.20/MyEcrResponce.cgx"); 

    DeviceWS.MyEcrResponceSoapClient DevHD = new DeviceWS.MyEcrResponceSoapClient(); 
    DevHD.Endpoint.Address = new System.ServiceModel.EndpointAddress(ur); 

    DevHD.ClientCredentials.UserName.UserName = "user"; 
    DevHD.ClientCredentials.UserName.Password = "pass";  

    reply = DevHD.Cmd(CmdTxt.Text, out LcdMsg1, out LcdMsg2); 

    ReplyTxt.Text = reply; 
    LCD01.Text = LcdMsg1; 
    LCD02.Text = LcdMsg2;  
} 

Benim PHP istemci şöyle ch kombinasyonunu denerim, PHP'de her zaman C# client komutunun son sonucunu alırım. PHP ile yapılan tüm isteklerin göz ardı edildiği görülmektedir. C# overpass bir yerde bir önbellek var gibi görünüyor, ama PHP yapamaz. Php.ini dosyasında hem 'soap.wsdl_cache_enabled' hem de 'soap.wsdl_cache' değeri 0 olarak ayarlanır. SoapUI ile ve diğer SOAP testleriyle aynı (hatalı) davranışı elde ederim. Herhangi bir fikir?

Güncelleştirme 1: PHP $ client -> __ getTypes(); döner bu:

array (4) [ 
    string (31) "struct Cmd { 
string CmdText; 
}" 
    string (76) "struct CmdResponse { 
string CmdReply; 
string LcdLine1; 
string LcdLine2; 
}" 
    string (58) "struct GetAppStatus { 
string SerialNo; 
string RetData; 
}" 
    string (82) "struct GetAppStatusResponse { 
unsignedByte GetAppStatusResult; 
string RetData; 
}" 
] 

Güncelleme 2: bu biridir çalışma SABUN isteğini kontrol etmek için C# istemci izleme günlüğü etkin this post Kullanılması: Maalesef

{ 
Content-Type: text/xml; charset=utf-8 
SOAPAction: "http://192.168.1.20/Cmd" 
Accept-Encoding: gzip, deflate,gzip, deflate 
Authorization: Basic xxxxxxxxxxxxxxxx 
Host: 192.168.1.20 
Content-Length: 207 
Expect: 100-continue 
} 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <Cmd xmlns="http://192.168.1.20/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <CmdText>a/</CmdText> 
     </Cmd> 
    </s:Body> 
</s:Envelope> 

, sonuç hala aynı isteği kopyalayıp PHP veya SoapUI'ye yapıştırdığımda.

Güncelleme 3: Bugün pazartesi. Hem yazarkasa makinesi hem de PHP sunucusu Cuma günü kapanıyordu ve bugün onları açtım. Ben PHP betiği çalıştırmadan ÖNCE tüm önbellek dosyalarını PHP sunucusundan temizledim ve Cuma günü gönderdiğim son başarılı komuttan cevap aldım !!! Ben

+0

ini_set koymak deneyin ('soap.wsdl_cache_enabled' '0'); ini_set ('soap.wsdl_cache_ttl', '0'); – WhSol

+0

Önbelleğin devre dışı bırakıldığından bahsetmiştim. – nasos

cevap

0

Sorunumu en azından bir şekilde çözmeyi başardım. SOAP isteklerinin düzgün çalışmasını sağlayamadım, ancak websockets kullanarak başarıyla iletişim kurmayı başardım. SOAP'ta ısrar ettim çünkü daha fazla deneyime sahibim, ama pes etmek zorunda kaldım. Çok hafif bir şey istedim (büyük besteci tabanlı kütüphanelerden kaçınmak istedim), bu yüzden bir çok aradan sonra this post buldum. Bu sayede ihtiyaçlarma uyarladım ve şimdi değerli cevaplarımı aldım. Aynı veya benzer sorunlara bakan herkes için yazarkasa makinesi RBS yazılımı (Yunan şirketi) ve Keil-EWeb sunucusunu kullanıyor. Benim modifiye çalışma PHP kodu takip ediyor:

class WebsocketClient 
{ 
    private $_Socket = null; 

    public function __construct($host, $port) 
    { 
     $header = "GET/HTTP/1.1\r\n"; 
     $header.= "Host: ".$host.":".$port."\r\n"; 

     $this->_Socket = fsockopen($host, $port, $errno, $errstr, 2); 
     fwrite($this->_Socket, $header) or die('Error: ' . $errno . ':' . $errstr); 
     $response = fread($this->_Socket, 2000); 
    } 

    public function __destruct() 
    { 
     fclose($this->_Socket); 
    } 

    public function sendData($data) 
    { 
     fwrite($this->_Socket, $data) or die('Error:' . $errno . ':' . $errstr); 
     $wsData = fread($this->_Socket, 2000); 
     $retData = trim($wsData,"\x00\xff");   
     return mb_convert_encoding($retData,'utf-8','ISO-8859-7'); // Returns garbage in case of greek (or other letters) 
    } 
} 

$WebSocketClient = new WebsocketClient('192.168.1.20', 9101); 
echo $WebSocketClient->sendData('a/'); 
unset($WebSocketClient); 
0

deneyin istemci oluşturmadan önce

ini_set('soap.wsdl_cache_enabled', '0'); 
ini_set('soap.wsdl_cache_ttl', '0'); 

koymak ... Ben çok aptal olmak zorunda inanmak noktasına yakın değilim.

Artık bir süredir istemci oluştururken NO_CACHE kullanıyorsunuz.

+0

Önbelleğin devre dışı bırakıldığından bahsetmiştim. – nasos

İlgili konular