2013-04-05 5 views
3

У меня есть некоторые проблемы, связанные с wsHttpBinding WCF с PHP. Первоначально я пытался использовать SOAP1.2, но не мог заставить его указать действие WS.php consume WCF SSL SOAP Client 1.2

Я загрузил библиотеку nusoap. Первоначально я получал сообщение об ошибке, заявляя, что веб-служба не будет принимать данные из-за несоответствия типа (text/xml вместо ожидаемого приложения/мыла + xml). Мне удалось внести изменения в nusoap.php, чтобы отправить данные как application/soap + xml). Теперь, когда не возникает ошибка, я получаю 400 ошибок с сервера.

Я могу использовать сервис из WCFTestClient, а также из SOAPUI без каких-либо проблем, но просто не могу заставить его летать с PHP. Я даже скопировал весь конверт с мылом из SOAPUI и установил $ soapmsg в nusoap.php точно так, и он все еще не работает.

Поэтому любой желающий может предложить некоторые рекомендации.

EDIT Это код, я пытался в SOAP 1,2

$params = array("soap_version"=> SOAP_1_2, 
       "trace"=>1, 
       "exceptions"=>0, 
       ); 

$client = @new SoapClient('https://localhost/wcftest/Service.svc?wsdl',$params); 

$retval = $client->GetData(array('value'=>'stuff')); 
if (is_soap_fault($retval)) { 
    trigger_error("SOAP Fault: (faultcode: {$retval->faultcode}, faultstring: {$retval->faultstring})", E_USER_ERROR); 
} 

EDIT # 2 Это код, который работает из SoapUI

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/"> 
    <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:Action>http://tempuri.org/IService/GetData</wsa:Action></soap:Header> 
    <soap:Body> 
     <tem:GetData> 
     <!--Optional:--> 
     <tem:value>stuff</tem:value> 
     </tem:GetData> 
    </soap:Body> 
</soap:Envelope> 

После добавления SoapHeaders вручную как упоминалось в ссылке Gords ниже, я получаю это как __last_request при отладке с netbeans и по-прежнему той же ошибкой

"<?xml version="1.0" encoding="UTF-8"?> 
    <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://tempuri.org/"> 
<env:Header> 
<ns1:Action>http://tempuri.org/IService/GetData</ns1:Action> 
</env:Header> 
<env:Body><ns1:GetData><ns1:value>stuff</ns1:value></ns1:GetData></env:Body></env:Envelope> 

любой совет?

Спасибо! Andy

+2

Если вы работаете на PHP5 вы пробовали РНР встроенная поддержка SOAP? Я использовал веб-службу на основе ASP.NET, которую можно было бы назвать с помощью реализации SOAP PHP5, но не мог быть вызван из NuSOAP. (IIRC это как-то связано с передачей аргументов веб-службе в качестве объектов, что, по-видимому, не могло сделать NuSOAP.) –

+0

Привет, Горд. Спасибо за ответ. Когда я использовал SOAP_CLIENT (в отличие от Nusoap_client), я бы постоянно получал ошибку «Действие SOAP, указанное в сообщении, '', не соответствует действию HTTP SOAP, 'http://tempuri.org/IService/ Получить данные. это была одна из причин, по которой я переключился на nusoap. –

+1

Вы упомянули SOAP_1.2, но попытались ли вы использовать WSDL? Опять же, как я помню (это было несколько лет назад), это был единственный способ, с помощью которого PHP мог бы взаимодействовать с этим веб-сервисом. Несколько раз, когда я пытался вникнуть в нее дальше, я увязнул, потому что документы MS были связаны с потреблением веб-сервисов ASP.NET от приложений .NET, и большинство ссылок PHP, которые я мог найти (блоги и т. Д.), Не выглядели страшно заинтересованы в поддержке чего-либо, связанного с MS.:( –

ответ

5

Хорошо, поэтому я получил это для работы. Спасибо Горду за то, что он сделал мне двойную проверку, которую я раньше не замечал.

Я закончил канаву nusoap и просто придерживался SOAP 1.2. Вот мой PHP код

//Declare some paramaters for our soapclient. Need to make sure its set to soap 1.2 
$params = array("soap_version"=> SOAP_1_2, 
       "trace"=>1, 
       "exceptions"=>0, 
       ); 

//Create the soap client 
$client = new SoapClient('https://localhost/wcftest/Service.svc?wsdl',$params); 
//add some WSAddressing Headers in. Ensure that you have the Namespace as the address if you are using wsHttpBinding on the endpoint 
//This was the step that took me the longest to figure out! 
$actionHeader = new SoapHeader('http://www.w3.org/2005/08/addressing','Action','http://tempuri.org/IService/GetData',true); 
//Add the headers into the client 
$client->__setSoapHeaders($actionHeader); 
//Make the call and pass in the variables that we require to go to the server 
$retval = $client->__soapCall('GetData',array('value'=>'stuff')); 
//Some Error Catching 
if (is_soap_fault($retval)) { 
    trigger_error("SOAP Fault: (faultcode: {$retval->faultcode}, faultstring: {$retval->faultstring})", E_USER_ERROR); 
} 

и рабочий конверт

<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://tempuri.org/" xmlns:ns2="http://www.w3.org/2005/08/addressing"> 
    <env:Header> 
     <ns2:Action env:mustUnderstand="true">http://tempuri.org/IService/GetData</ns2:Action> 
    </env:Header> 
    <env:Body> 
     <ns1:GetData/> 
    </env:Body> 
</env:Envelope> 

и файл web.config из службы WCF

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0"/> 
    </system.web> 
    <connectionStrings> 
    <add name="Timeforce" connectionString="Data Source=apps.ziptrek.com;Initial Catalog=qqest;User ID=qqest; Password=qqest;" 
     providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="TransportSecurity"> 
      <security mode="Transport"> 
      <transport clientCredentialType="None"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service name="Service" behaviorConfiguration="Service1"> 
     <endpoint address="https://localhost/wcftest/Service.svc" binding="wsHttpBinding" bindingConfiguration="TransportSecurity" contract="IService"></endpoint> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="Service1"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpsGetEnabled="true"/> 

      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="httpsService1"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false"/> 


    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 
+2

+ 1 Рад слышать, что вы получили его! –

+0

У меня эта ошибка: ошибка SOAP: (код ошибки: s: отправитель, ошибка: ошибка при проверке безопасности для сообщения.) –

Смежные вопросы