无法在PHP中连接到SSRS

时间:2014-02-28 23:57:39

标签: php sql-server reporting-services

我正在使用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',
)

2 个答案:

答案 0 :(得分:6)

问题出在身份验证类型上。

By default, Reporting Services accepts requests that specify Negotiate and NTLM authentication. If your deployment includes client applications or browsers that use Basic authentication, you must add Basic authentication to the list of supported types.

要获得标题响应,我在第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(),
));