Kann keine Verbindung zu SSRS in PHP herstellen

Ich verwende SSRS SDK für PHP

PHP Version 5.4

Webserver: Centos 6.4

MSSQL server 2008 R2

define("UID", "*****\*****"); define("PASWD", "*****"); define("SERVICE_URL", "http://192.168.0.1/ReportserverURL/"); try { $ssrs_report = new SSRSReport(new Credentials(UID, PASWD), SERVICE_URL); } catch (SSRSReportException $serviceException) { echo $serviceException->GetErrorMessage() . "<br>"; } 

Wenn ich versuche, den SSRS-Bericht zu verbinden, besteht der folgende Fehler:

Failed to connect to Reporting Service Make sure that the url (http://192.168.0.1/ReportserverURL/) and credentials are correct!

Die gleichen Anmeldeinformationen & Link sind über den Browser ohne Problem zugänglich. Aber durch SSRS SDK funktioniert es nicht.

Ich war auf der search nach einer Lösung im Netz und ich finde, dass mit der file TestSSRSConnection.php Ich könnte mehr Details bekommen, aber ich weiß nicht, wie man es benutzt, und ich kann keine Dokumentation darüber finden.

 $testSSRSConnection = new TestSSRSConnection("/192.168.0.1/TESTREPORT/ReportserverURL/*****\*****/*****"); $testSSRSConnection->Parse(); $testSSRSConnection->TestConnection(); 

Testen Sie den folgenden Fehler:

 Usage:TestSSRSConnection.php /server: /report: /uid: /pwd: [/datasource: /uid: /pwd:] 

Eine Idee, wie man in diesem Thema vorankommt?

Aktualisieren Sie einen var_export($http_response_header))

ich habe

 array ( 0 => 'HTTP/1.1 401 Unauthorized', 1 => 'Content-Length: 0', 2 => 'WWW-Authenticate: Negotiate', 3 => 'WWW-Authenticate: NTLM', 4 => 'Date: Tue, 04 Mar 2014 22:13:58 GMT', 5 => 'Connection: close', ) 

Das Problem war mit dem authenticationstyp.

Standardmäßig akzeptiert Reporting Services Anfragen, die Negotiate und NTLM-authentication angeben. Wenn Ihre Bereitstellung Clientanwendungen oder Browser enthält, die die Standardauthentifizierung verwenden, müssen Sie der list der unterstützten Typen eine Standardauthentifizierung hinzufügen.

Um die Header-Antwort zu erhalten, habe ich in der SSRSReport.php in der Zeile 193 hinzugefügt

 if ($content === FALSE) { throw new SSRSReportException("", "<br>Failed to connect to Reporting Service <br/> Make sure " . "that the url ($this->_BaseUrl) and credentials are correct!<br>" . var_export($http_response_header));//Line added by me to get the http header response } 

Ausgabe:

 array ( 0 => 'HTTP/1.1 401 Unauthorized', 1 => 'Content-Length: 0', 2 => 'WWW-Authenticate: Negotiate', 3 => 'WWW-Authenticate: NTLM', 4 => 'Date: Tue, 04 Mar 2014 22:13:58 GMT', 5 => 'Connection: close', ) Failed to connect to Reporting Service Make sure that the url (http://192.168.0.1/ReportserverURL/) and credentials are correct! 

Das Hinzufügen einer Standardauthentifizierung zum SSRS triggers das Problem.

So konfigurieren Sie einen Berichtsserver für die Standardauthentifizierung

1 Öffnen Sie RSReportserver.config in einem Texteditor.

2- finden.

3- Kopiere eine der folgenden XML-Strukturen, die am besten zu deinen Bedürfnissen passt. Die erste XML-Struktur bietet Platzhaltern für die Spezifizierung aller Elemente, die im nächsten Abschnitt beschrieben werden:

 <Authentication> <AuthenticationTypes> <RSWindowsBasic> <LogonMethod>3</LogonMethod> <Realm></Realm> <DefaultDomain></DefaultDomain> </RSWindowsBasic> </AuthenticationTypes> <EnableAuthPersistence>true</EnableAuthPersistence> </Authentication> 

Wenn Sie Standardwerte verwenden, können Sie die minimale Elementstruktur kopieren:

  <AuthenticationTypes> <RSWindowsBasic/> </AuthenticationTypes> 

4 Fügen Sie ihn über die vorhandenen Einträge ein.

Wenn Sie mehrere authenticationstypen verwenden, fügen Sie nur das RSWindowsBasic-Element hinzu, löschen aber nicht die Einträge für RSWindowsNegotiate, RSWindowsNTLM oder RSWindowsKerberos.

Um den Safari-Browser zu unterstützen, können Sie den Berichtsserver nicht für die Verwendung mehrerer authenticationstypen konfigurieren. Sie müssen nur RSWindowsBasic angeben und die anderen Einträge löschen.

Beachten Sie, dass Sie keine benutzerdefinierten mit anderen authenticationstypen verwenden können.

5- Ersetzen Sie leere Werte für oder mit Werten, die für Ihre Umgebung gültig sind.

6- memoryn Sie die file.

7- Wenn Sie eine Skalierung-Bereitstellung konfiguriert haben, wiederholen Sie diese Schritte für andere Berichtsserver in der Bereitstellung.

8- Starten Sie den Berichtsserver neu, um alle aktuell geöffneten sessionen zu löschen.

Angenommen, es gibt keine tatsächlichen Fehler in der SDK, würde ich wagen eine Vermutung zu sagen, das Problem liegt mit den Konstanten, die Sie definiert haben:

 define("UID", "*****\*****"); 

Der Backslash trennt die Domain vom Benutzernamen in Windows, hat aber eine spezielle Bedeutung in einem String-Wert, zB:

 define("UID", "domain\nick"); echo UID; 

Ausgabe

 domain nick 

Das \n wurde in eine Zeilenumbringung umgewandelt; Also, was du willst, entkommt dem Backslash:

 define("UID", "domain\\nick"); // backslash is escaped echo UID; // output: domain\nick 

Aktualisieren

Innerhalb von SSRSReport.php (Zeile 168) gibt es das:

 $stream_conext_params = array('http' => array( 'header' => array($credentials->getBase64Auth()) )); 

Die header Kontextoption dauert jedoch einen String, kein Array:

 $stream_conext_params = array('http' => array( 'header' => $credentials->getBase64Auth(), ));