SSRS 服务器给出 401 Unauthorized 响应,但仅在通过 API 调用时

SSRS server gives a 401 Unauthorised response, but only when called via the APIs

我正在尝试从我的应用程序中的服务器 运行 SSRS 报告,并将结果下载为 PDF。为此,我为服务器上的用户提供了网络凭据,该用户有权访问 运行 报告。

这一切都适用于我本地的 SSRS 开发人员副本,我可以 运行 报告并愉快地继续保存它。但是,当我在服务器上安装 SSRS 运行ning 并将应用程序指向该服务器时,我在尝试 运行 报告时立即收到 401 Unauthorized 错误。

我可以在尝试 运行 应用程序的同一台计算机上通过浏览器访问同一远程服务器,使用在应用程序中失败的相同凭据,并成功 运行有关的报告。 None 的在线可用解决方案似乎 apply/help。

下面是我用来尝试执行报告的代码 - ReportingUsername、ReportingPassword 被设置为可在浏览器中使用的凭据,ReportingDomain 被设置为 PC 的名称,因为它使用本地帐户(这是一个故障排除步骤,我以前没有它也不起作用),设置 PreAuthenticate 是另一个故障排除步骤。 ReportServerUrl 是 http://server/ReportServer(服务器 运行ning 作为端口 80 上的默认实例),JCReportFolder 设置为报告在服务器上所在的文件夹。

ReportKey 只是用于运行 报告的参数。


//setup credentials and URL of report execution service
ReportExecutionService rs = new ReportExecutionService();
NetworkCredential nwk = new System.Net.NetworkCredential(ReportingUsername, ReportingPassword, ReportingDomain);
rs.Credentials = nwk;
rs.PreAuthenticate = true;
rs.Url = ReportServerUrl + "/" + "reportexecution2005.asmx";
rs.ExecutionHeaderValue = new ExecutionHeader();
var executionInfo = new ExecutionInfo();
executionInfo = rs.LoadReport("/" + JCReportFolder + "/" + reportName, null);

//set report key
List<ParameterValue> parameters = new List<ParameterValue>();
parameters.Add(new ParameterValue { Name = "ReportKey", Value = reportKey });
rs.SetExecutionParameters(parameters.ToArray(), "en-US");


string deviceInfo = "<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";
string mimeType;
string encoding;
string[] streamId;
Warning[] warning;

var result = rs.Render("PDF", deviceInfo, out mimeType, out encoding, out encoding, out warning, out streamId);

有人有什么建议吗?目前尝试过:

确保 .net 使用受支持的 TLS 版本,当 MS 增加 windows 服务器使用的默认 TLS 版本时,我们 运行 陷入看似 运行dom 身份验证问题。

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

经过一番摸索,结果证明这是一个非常荒谬的问题。

原来设置ReportExecutionService.Url出于某种原因清除了ReportExecutionService.Credentials。简单地移动线

rs.Credentials = nwk;

之前

executionInfo = rs.LoadReport("/" + JCReportFolder + "/" + reportName, null);

完全解决了问题。

我的猜测是我没有在本地遇到问题,因为应用程序实际上默认以我的本地管理员帐户执行,因此掩盖了问题。