Неперехваченное исключение SoapFault: [WSDL] ОШИБКА SOAP: Синтаксический анализ WSDL
Я использую SSRS SDK для PHP
Версия PHP 5.4
Веб-сервер: Centos 6.4
MSSQL Сервер 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
Я ищу, как это исправить и получить отчет с помощью soap(SSRS SDK для PHP).
Я пробовал использовать file_get_content()
и curl
, и оба работали нормально, тогда проблем с подключением нет, у меня есть
- Клиент Soap включено
- allow_url_fopen включен
Это строка, в которой sdk вызывает службу soap
$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 СЕРВЕР
Обновление
Как сказал @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
1 answers
Некоторые ошибки, которые я обнаружил только методом проб и ошибок, - это некоторые проблемы с конфигурацией. На сервере, на котором запущена служба сервера отчетов, убедитесь, что в вашем файле rsreportserver.config были изменены, чтобы разрешить базовую аутентификацию. По умолчанию, если я правильно понимаю, ему требуется более надежный тип подключения, но sdk требует, чтобы вы разрешали передавать простые имена и пароли. Это означает, что необходимо добавить к вашим методам аутентификации в конфигурация.
Так, например,
В C:\Program Файлы\Microsoft SQL Server\MSRS11.1\Службы отчетов\ReportServer\rsreportserver.config (Отличается для сервера и версии, но вы поняли идею.)
<Authentication>
<AuthenticationTypes>
<RSWindowsNTLM/>
<RSWindowsBasic/> ##you need to add this one##
</AuthenticationTypes>
<RSWindowsExtendedProtectionLevel>Off</RSWindowsExtendedProtectionLevel>
</Authentication>
IIRC вам придется перезапустить службу, чтобы это вступило в силу.
Кроме того, если вы пытаетесь выполнить визуализацию, в некоторых файлах шаблонов, используемых для отображения заголовков, есть место внизу, что не позволит вам отображать их в формате Excel, PDF и т. Д. если только это не было исправлено с тех пор, как я работал над этим.
Я просматриваю предоставленный вами код, возможно, я читаю его неправильно, но похоже, что вы пытаетесь явно определить отчет, который вам нужен, в URL-адресе выполнения. Если это на самом деле то, что вы делаете, я полагаю, что исправлением будет только определение базы отчетов, к которой вы подключаетесь, поэтому для вашего примера URL-адрес должен быть http://172.16.4.63/ReportServer/
. После того, как это соединение будет установлено, вы будете использовать функцию LoadReport2, чтобы указать, какой отчет вы необходимость.
Наконец, там, где у вас есть название отчета, похоже, у вас есть подкаталог под названием testfolder? если это все еще так, вам потребуется, чтобы имя вашего отчета было "/TestFolder/testclaimhdr" при вызове LoadReport2.
Надеюсь, что все это поможет.