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 - 主要区别是啥?
在 C# 中调用 Gmail 服务 API 时出现 System.Net.Http.HttpRequestException