Windows 服务在使用 System.Net.WebException 以 PDF 格式发送报告时失败:请求失败,HTTP 状态 401:未经授权

Posted

技术标签:

【中文标题】Windows 服务在使用 System.Net.WebException 以 PDF 格式发送报告时失败:请求失败,HTTP 状态 401:未经授权【英文标题】:windows service failing while sending report as PDF with System.Net.WebException: The request failed with HTTP status 401: Unauthorized 【发布时间】:2012-11-16 09:12:08 【问题描述】:

我正在尝试从 Windows 服务以 PDF 格式发送 s-s-rS 报告。这在我的本地机器和登台设置上对我来说很好,但我在生产环境中遇到错误。这对我来说似乎是一些权限问题,但我无法确定确切的问题。以下是 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 message, WebResponse response, Stream responseStream, Boolean asyncCall) at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)

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),但这些都没有帮助。请建议我还能检查和修复什么。谢谢。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于Windows 服务在使用 System.Net.WebException 以 PDF 格式发送报告时失败:请求失败,HTTP 状态 401:未经授权的主要内容,如果未能解决你的问题,请参考以下文章

[通用 Windows 平台] 中的 System.Net.Http.HttpClient 无法正常工作

在 Windows.Web.Http 和 System.Net.Http 中混淆使用哪个版本的 HttpClient;

尝试使用 WCF 服务时出现 System.Net.WebException

System.Net.Http.HttpClient vs Windows.Web.Http.HttpClient - 主要区别是啥?

Windows 服务未启动 - Excel - 邮件互操作

在 C# 中调用 Gmail 服务 API 时出现 System.Net.Http.HttpRequestException