# Uncaught SoapFault exception ohne Begründung bei einfachem Logon



## Blue Effect (21. Juli 2010)

Hallo,

ich versuche eine ganz kleine, einfache Schnittstelle zu affili.net aufzubauen. Ich habe nur einen vorgegebenen fertigen Code 1:1 kopiert: 

```
define ("WSDL_LOGON", "https://developer-api.affili.net/V2.0/Logon.svc?wsdl");
define ("WSDL_STATS",  "https://developer-api.affili.net/V2.0/PublisherStatistics.svc?wsdl");

$Username   = '';     // your developer ID
$Password   = '';     // your developer portal password
$DemoPublisherId   = 403233;  // one of the publisher IDs of our demo database
$DeveloperSettings = array('SandboxPublisherID' => $DemoPublisherId);

$SOAP_LOGON = new SoapClient(WSDL_LOGON);
$Token      = $SOAP_LOGON->Logon(array(
                     'Username'  => $Username,
                     'Password'  => $Password,
                     'WebServiceType' => 'Publisher',
                     'DeveloperSettings' => $DeveloperSettings,
                     'trace'=>1
                     ));
```
Bei mir kommt, lokal unter PHP5.3.0 und xampp, nur eine Fehlermeldung:


> Fatal error: Uncaught SoapFault exception: [s:Client] The creator of this fault did not specify a Reason. in ...script.php:40 Stack trace: #0 [...]



Was bedeutet das? Beim Suchen bin ich nur auf eine Möglichkeit gestoßen den Fehler zu finden:

```
is_soap_fault($Token) {...
```
Aber da geht er gar nicht rein.

Akzeptiert meine Testumgebung vielleicht keine https-Verbindungen?


----------



## Michael Engel (21. Juli 2010)

Du solltest die komplette Soap Kommunikation immer mit try und catch behandeln. Um auf alle möglichen Fehler reagieren zu können. trace im Verbindungsaufbau mit anzugeben gibt dir die Möglichkeit noch etwas genauer hinschauen zu können warum die Kommunikation denn fehlgeschlagen ist.


```
try {
	$SOAP_LOGON = new SoapClient(WSDL_LOGON, array('trace' => 1)); 
	$Token  = $SOAP_LOGON->Logon(array( 
                     'Username'  => $Username, 
                     'Password'  => $Password, 
                     'WebServiceType' => 'Publisher', 
                     'DeveloperSettings' => $DeveloperSettings, 
                     'trace'=>1 
                     ));  
} catch(SoapFault $e) {
	echo "Request :\n". ($SOAP_LOGON->__getLastRequest()). "\n";
	echo "Response :\n". ($SOAP_LOGON->__getLastResponseHeaders()). "\n";
	echo "Response :\n". ($SOAP_LOGON->__getLastResponse()). "\n";
	echo($e->getMessage());
} catch(Exception $e) {
	echo $e->getMessage();
}
```


----------



## Matt297 (21. Juli 2010)

> The creator of this fault did not specify a Reason.


Das klingt nach einem per Hand geschmissenem SoapFault ohne faultstring.

Probier mal

```
$SOAP_LOGON = new SoapClient(WSDL_LOGON,array(
"exceptions" => false);
```
Mit dieser Option wird bei einem Fehler keine Exception geschmissen sondern ein SoapFault-Objekt zurückgegeben. Sprich deine Variable $Token wäre dann ein Objekt vom Typ SoapFault und genau das könntest du mit der Methode is_soap_fault() überprüfen.
Viel bringen würde dir das aber nicht, weil du dadurch nur die selben Informationen in einer Variablen hättest, die du auch schon vorher als Uncaught-Exception-Text bekommst.

Ich hab mir jetzt gerade mal den Link angesehen und auch schon was verdächtiges gesehen, und zwar das 
	
	
	



```
'trace'=>1
```
 beim aufruf der Logon-Methode. 
Ich vermute, du wolltest das haben, um die Response's und Requests nachverfolgen zu können: 
	
	
	



```
$SOAP_LOGON = new SoapClient(WSDL_LOGON,array(
"exceptions" => false, //Kann auch weggelassen werden
"trace" => 1);
```
Und natürlich das trace bei der Logon-Methode weglassen.


----------



## Blue Effect (21. Juli 2010)

Hey super, danke. Auf das try catch bin ich nicht gekommen, das hat mir etwas weitergeholfen. Auch das trace bringe ich jetzt richtig unter. 

Ich weiß jetzt dass das Login fehlschlug. 
Der zeigt mir erst den Header an und dann


> Response : s:Client1090000035|Login failed.1090000035Login failed. 1090000035|Login failed.


Das ist aber keine PHP-Meldung mehr, sondern die Logik des angesprochenen, also affili, richtig?


----------



## Yaslaw (22. Juli 2010)

Mit set_error_handler kannst du auch nicht Exceptions (also normale Errors) als Exceptions handeln und sauber in den Trace nehmen
http://wiki.yaslaw.info/wikka/PhpErrorsAsExceptions


```
function exceptionErrorHandler($errno, $errstr, $errfile, $errline ) {
    if($errno & ini_get('error_reporting')) {
        throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
    }
}
set_error_handler("exceptionErrorHandler");

try{
    //TODO dein Code
} catch(Exception $e){
    echo "<b>".$e->getMessage()."</b><br />\n";
    echo nl2br($e->getTraceAsString());
}
```


----------

