0

我正在尝试从 Windows 服务以 PDF 格式发送 SSRS 报告。这在我的本地机器和登台设置上对我来说很好,但我在生产环境中遇到错误。这对我来说似乎是一些权限问题,但我无法确定确切的问题。以下是 Windows 服务日志中出现的错误:

<log4j:event logger="MyProjectNamespace.Logger" timestamp="1352927717254" level="ERROR" thread="377">  
    <log4j:message>The request failed with HTTP status 401: Unauthorized.  </log4j:message>
    <log4j:properties>  
        <log4j:data name="log4net:UserName" value="NT AUTHORITY\SYSTEM" />  
        <log4j:data name="log4jmachinename" value="<My server machine name>" />  
        <log4j:data name="log4japp" value="<My windows service exe name>" />  
        <log4j:data name="log4net:HostName" value="<My host name>" />  
    </log4j:properties>  
    <log4j:throwable>

System.Net.WebException:请求失败,HTTP 状态为 401:未经授权。在 System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage 消息,WebResponse 响应,流 responseStream,布尔 asyncCall)在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(字符串方法名,对象 [] 参数)

From stacktrace, line which is producing error is below:
    Rse2005.ExecutionInfo ei = rsExec.LoadReport(reportPath, historyID);

here "rsExec" is object of type "Rse2005.ReportExecutionService", historyId is NULL

我创建报告 PDF 的代码如下:

private static void RenderReport(string reportFormat, string reportPath, string parameterLanguage, Rse2005.ParameterValue[] rptParameters, string outputFilePath)
        {
            string historyID = null;
            string deviceInfo = null;
            string encoding = String.Empty;
            string mimeType = String.Empty;
            string extension = String.Empty;
            Rse2005.Warning[] warnings = null;
            string[] streamIDs = null;

            Rse2005.ReportExecutionService rsExec = new Rse2005.ReportExecutionService();
            rsExec.Credentials = System.Net.CredentialCache.DefaultCredentials;

            Rse2005.ExecutionInfo ei = rsExec.LoadReport(reportPath, historyID);
            rsExec.SetExecutionParameters(rptParameters, parameterLanguage);
            Byte[] results = rsExec.Render(reportFormat, deviceInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);

            File.WriteAllBytes(outputFilePath, results);
        }

此方法获取报告路径,如“文件夹名称/报告名称”。

我还使用来自 webApp(在同一台服务器上)的 reportViewer 控件显示相同的报告,并且它运行良好。我的报表服务器、windows服务和webApp都在同一台服务器上

我试图在报告站点设置中授予用户“NT AUTHORITY\SYSTEM”权限,并将reportPath 更改为带有服务器名称的完整路径(如http:///reportserver/folderName/ReportName),但这些都没有帮助。请建议我还能检查和修复什么。谢谢。

4

1 回答 1

0

NT Authority\System是本地系统帐户。它无法访问另一台机器上的资源,有时会保护本地资源以防止该帐户访问。因此,如果您在另一台机器(例如 SQL 服务器)上授予此帐户权限,那么它与运行您的服务的帐户实际上并不是同一个帐户。

尝试使用域用户的凭据运行您的服务。在 SSRS 中为该用户设置适当的权限。

于 2012-11-16T15:51:57.933 回答