我正在使用SSRS SDK for 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>";
}
当我尝试连接SSRS报告时,它会遇到以下错误:
Failed to connect to Reporting Service
Make sure that the url (http://192.168.0.1/ReportServerURL/) and credentials are correct!
相同的凭据和链接可以通过浏览器访问没有问题。但是,通过SSRS SDK它无法正常工作。
我正在寻找网络中的解决方案,我发现使用文件TestSSRSConnection.php
我可以获得更多细节,但我不知道如何使用它,我找不到任何关于它的文档。
$testSSRSConnection = new TestSSRSConnection("/192.168.0.1/TESTREPORT/ReportServerURL/*****\*****/*****");
$testSSRSConnection->Parse();
$testSSRSConnection->TestConnection();
测试它我收到以下错误:
Usage:TestSSRSConnection.php /server: /report: /uid: /pwd: [/datasource: /uid: /pwd:]
有些想法如何在这个主题中前进?
更新
做var_export($http_response_header))
我得到了
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',
)
答案 0 :(得分:6)
问题出在身份验证类型上。
要获得标题响应,我在第193行的SSRSReport.php中添加了
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
}
输出:
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!
向SSRS添加基本身份验证可以解决问题。
配置报表服务器以使用基本身份验证
1-在文本编辑器中打开RSReportServer.config。
2-查找Authentication
。
3-复制以下最适合您需求的XML结构之一。第一个XML结构提供了占位符,用于指定所有元素,这些元素将在下一节中介绍:
<Authentication>
<AuthenticationTypes>
<RSWindowsBasic>
<LogonMethod>3</LogonMethod>
<Realm></Realm>
<DefaultDomain></DefaultDomain>
</RSWindowsBasic>
</AuthenticationTypes>
<EnableAuthPersistence>true</EnableAuthPersistence>
</Authentication>
如果使用默认值,则可以复制最小元素结构:
<AuthenticationTypes>
<RSWindowsBasic/>
</AuthenticationTypes>
4-将其粘贴到。
的现有条目上如果您使用多种身份验证类型,请仅添加RSWindowsBasic元素,但不要删除RSWindowsNegotiate,RSWindowsNTLM或RSWindowsKerberos的条目。
要支持Safari浏览器,您无法将报表服务器配置为使用多种身份验证类型。您必须仅指定RSWindowsBasic并删除其他条目。
请注意,您不能将Custom与其他身份验证类型一起使用。
5-为您的环境有效的值替换空值。
6-保存文件。
7-如果您配置了横向扩展部署,请对部署中的其他报表服务器重复这些步骤。
8-重新启动报表服务器以清除当前打开的所有会话。
答案 1 :(得分:3)
假设SDK中没有实际的错误,我会冒昧地猜测问题在于您定义的常量:
define("UID", "*****\*****");
反斜杠在Windows中将域与用户名分开,但它在字符串值中具有特殊含义,例如:
define("UID", "domain\nick");
echo UID;
<强>输出强>
domain
nick
\n
转换为换行符;所以你想要的是逃避反斜杠:
define("UID", "domain\\nick"); // backslash is escaped
echo UID; // output: domain\nick
<强>更新强>
在SSRSReport.php
内(第168行),就是:
$stream_conext_params = array('http' => array(
'header' => array($credentials->getBase64Auth())
));
但是,header
context选项采用字符串,而不是数组:
$stream_conext_params = array('http' => array(
'header' => $credentials->getBase64Auth(),
));