使用AngularJS从SSRS请求时出现SOAP错误

时间:2014-09-10 16:19:28

标签: javascript angularjs soap reporting-services

我正在使用AngularJS尝试从SSRS下拉报告列表以显示在iframe中。我遇到的问题是我在执行POST请求时遇到SOAP错误。

这是Angular控制器看起来正在进行POST的内容。

function ReportSSRSController($scope, $http, $location) {
    $scope.request = '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">'
        + '<soap:Body>'
        + '<m:ListChildren xmlns:m="http://example.com/ReportingServer/ReportService2010">'
        + '<m:ItemPath>/reports</m:ItemPath>'
        + '<m:Recursive>false</m:Recursive>' 
        + '</m:ListChildren>' 
        + '</soap:Body>' 
        + '</soap:Envelope>';
    $http({
        method: 'POST', 
        url: '/ReportServer/ReportService2010.asmx', 
        data: $scope.request, 
        headers: {
            'Content-Type': 'application/soap+xml; action="http://schemas.microsoft.com/sqlserver/reporting/2010/03/01/ReportServer/ListChildren"'
        }
    })
    .success(function(data, status, headers, config){
        console.log('In Success');
        $scope.data = data;
    })
    .error(function(data, status, headers, config){
        console.log('In Error');
        console.log(data);
        console.log(config);
    });
}

这是SOAP错误错误的要点。

  

System.Web.Services.Protocols.SoapException:未指定参数“ItemPath”的值。它在函数调用中丢失,或者设置为null。

正如您在Angular代码中所看到的,ItemPath包含在SOAP主体中与函数调用相同的命名空间中。我也可以在控制台中看到它作为错误块中data变量的输出。所以我想知道为什么它无法找到这些信息。

Angular处理POST请求的方式是否有我遗漏的东西?或者我没有正确制定SOAP请求?

1 个答案:

答案 0 :(得分:2)

事实证明,该问题与SOAP XML中的命名空间有关。

当我将命名空间更改为

http://schemas.microsoft.com/sqlserver/reporting/2010/03/01/ReportServer

匹配SOAP操作(减去最后的命令);请求返回了有效的SOAP响应。

我不确定这是否是SOAP或SSRS的限制,因为我对这两者都不是很熟悉。