Я использую SSRS SDK для PHP
Версия PHP 5.4
WebServer: Centos 6.4
MSSQL Server 2008 R2
Когда я делаю
$ssrs_report = new SSRSReport(new Credentials(UID, PASWD), SERVICE_URL);
Я получил следующую ошибку
Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://172.16.4.63/ReportServerURL/Pages/ReportViewer.aspx?%2fTestFolder%2ftestClaimHdr&rs:Command=Render/ReportExecution2005.asmx?wsdl' : Premature end of data in tag html line 1 in /var/www/emilio/app/Libraries/SSRSReport/bin/SSRSReport.php:196 Stack trace: #0 /var/www/emilio/app/Libraries/SSRSReport/bin/SSRSReport.php(196): SoapClient->SoapClient('http://172.16.4...', Array) #1 /var/www/emilio/SSRS/index.php(12): SSRSReport->SSRSReport(Object(Credentials), 'http://172.16.4...') #2 {main} thrown in /var/www/emilio/app/Libraries/SSRSReport/bin/SSRSReport.php on line 196
Я ищу, как исправить это и получить отчет через мыло ( SSRS SDK для PHP ).
Я попытался использовать file_get_content()
и curl
и оба работали нормально, тогда это не проблемы с подключением, у меня есть
это линия, в которой вызов sdk вызывает мыло
$executionServiceUrl="http://172.16.4.63/ReportServerURL?%2fTestFolder%2ftestClaimHdr&rs:Command=Render/ReportExecution2005.asmx?wsdl"; $options = array ( 'login' => 'xxxx\\xxxx', 'password' => 'xxxx', ) $this->_soapHandle_Exe = new SoapClient($executionServiceUrl, $options);
Добавление
try { $this->_soapHandle_Exe = new SoapClient($executionServiceUrl, $options); } catch (Exception $e) { var_export(libxml_get_last_error()); }
Я получаю следующий массив:
LibXMLError::__set_state(array( 'level' => 3, 'code' => 77, 'column' => 43325, 'message' => 'Premature end of data in tag html line 1', 'file' => 'http://172.16.4.63/ReportServerURL?%2fTestFolder%2ftestClaimHdr&rs:Command=Render/ReportExecution2005.asmx?WSDL', 'line' => 1, )
Согласно xmlerror из libxml2
Уровень 3 = XML_ERR_FATAL = 3: Неустранимая ошибка
код 77 = XML_ERR_TAG_NOT_FINISHED = 77: 77
Я установил базовую аутентификацию в SSRS SERVER
Обновить
Поскольку @ jwhaley58 сказал, что я изменил на:
define("SERVICE_URL", "http://172.16.4.63/ReportServerURL"); $ssrs_report = new SSRSReport(new Credentials(UID, PASWD), SERVICE_URL); $ssrs_report->LoadReport2('testClaimHdr',NULL);
и я получаю:
Fatal error: Uncaught exception 'SSRSReportException' in /var/www/emilio/app/Libraries/SSRSReport/bin/SSRSReport.php:590 Stack trace: #0 /var/www/emilio/app/Libraries/SSRSReport/bin/SSRSReport.php(326): SSRSReport->ThrowReportException(Object(SoapFault)) #1 /var/www/emilio/SSRS/index.php(15): SSRSReport->LoadReport2('testClaimHdr', NULL) #2 {main} thrown in /var/www/emilio/app/Libraries/SSRSReport/bin/SSRSReport.php on line 590
Некоторые gochas, которые я нашел только через пробную версию и ошибку, – это некоторые проблемы с конфигурацией, на сервере, на котором запущена служба сервера отчетов, убедитесь, что в вашем файле rsreportserver.config был изменен, чтобы обеспечить базовую аутентификацию. По умолчанию, если я правильно понимаю его, он хочет получить более надежный тип подключения, но для sdk вам необходимо разрешить простую передачу имени и паролю. Это означает, что в настройках аутентификации необходимо добавить свои методы проверки подлинности.
так, например,
В C: \ Program Files \ Microsoft SQL Server \ MSRS11.1 \ Reporting Services \ ReportServer \ rsreportserver.config (различается для сервера и версии, но вы получаете эту идею).
<Authentication> <AuthenticationTypes> <RSWindowsNTLM/> <RSWindowsBasic/> ##you need to add this one## </AuthenticationTypes> <RSWindowsExtendedProtectionLevel>Off</RSWindowsExtendedProtectionLevel> </Authentication>
IIRC вам нужно будет перезапустить службу, чтобы это вступило в силу.
Кроме того, если вы пытаетесь RenderAs, некоторые файлы шаблонов, используемые для заполнения заголовков, имеют место в них внизу, что предотвратит рендеринг в виде Excel, PDF и т. Д., Если это не было исправлено с тех пор, как я работал над ним.
Я просматриваю код, который вы предоставили, я, возможно, читаю его неправильно, но похоже, что вы пытаетесь явно определить отчет, который вы используете, в URL-адресе выполнения. Если это на самом деле то, что вы делаете, я считаю, что исправление будет заключаться только в определении базы отчетов, к которой вы подключаетесь, поэтому для вашего примера URL должен быть http://172.16.4.63/ReportServer/
. После этого соединения вы будете использовать функцию LoadReport2, чтобы указать, какой отчет вам нужен.
Наконец, где у вас есть имя отчета, похоже, у вас есть подкаталог под названием testfolder? если это так, вам нужно, чтобы ваше имя отчета было «/ TestFolder / testClaimHdr» в вызове LoadReport2.
Надеюсь, что это поможет.