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
ini_set koymak deneyin ('soap.wsdl_cache_enabled' '0'); ini_set ('soap.wsdl_cache_ttl', '0'); – WhSol
Önbelleğin devre dışı bırakıldığından bahsetmiştim. – nasos