【问题标题】:Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL未捕获的 SoapFault 异常:[WSDL] SOAP-ERROR: Parsing WSDL
【发布时间】:2014-03-07 19:38:38
【问题描述】:

我正在使用SSRS SDK for PHP

PHP 5.4 版

网络服务器: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 for 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 from libxml2

级别 3 = XML_ERR_FATAL = 3:致命错误

代码 77 = XML_ERR_TAG_NOT_FINISHED = 77 : 77

我已经在 SSRS SERVER 中设置了Basic authentication

更新

正如@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

【问题讨论】:

  • 您可以尝试将其指向 ReportService2010 端点而不是 2005 端点?
  • @kyzen 我在 2010 上尝试过,结果相同,在浏览器中使用 url http://172.16.4.63/ReportServerURL?%2fTestFolder%2ftestClaimHdr&rs:Command=Render/ReportExecution2005.asmx?wsdlfile_get_contentcurl 在 2005 上工作正常
  • 今晚晚些时候我会再次检查这个问题 - 大约一年前我遇到了同样的问题,并设法让它以某种方式工作。如果我仍然有代码,我会回来发布我必须做的事情才能让它与 SSRS 2012 一起工作。
  • 我正在查看您提供的代码,我可能读错了,但看起来您正试图在执行 url 中明确定义您所追求的报告。如果这实际上是您正在做的事情,我相信解决方法是只定义您要连接的报告库,因此对于您的示例,url 应该是http://172.16.4.63/ReportServer/。建立连接后,您将使用 LoadReport2 函数指定您需要的报告。我有点理解只是因为我看不到你的实现。
  • @jwhaley58 我按你说的改了,出现新的错误,我把报告名称放在方法LoadReport2中,把历史id的NULL作为第二个参数

标签: php soap reporting-services ssrs-2008 ssrs-2008-r2


【解决方案1】:

我通过反复试验才发现的一些 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 的子目录?如果仍然如此,您需要在调用 LoadReport2 时将报告名称设为“/TestFolder/testClaimHdr”。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多