WindowsサービスからSSRSレポートをPDFとして送信しようとしています。これは、ローカルマシンとステージングのセットアップでは問題なく機能しますが、実稼働環境では以下のエラーが発生します。これは私には許可の問題のようですが、正確な問題を特定することはできません。以下は、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:Unauthorizedで失敗しました。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);
}
このメソッドは、「folderName/reportName」のようなreportPathを取得します。
また、(同じサーバー上の)webAppからreportViewerコントロールを使用して同じレポートを表示していますが、完全に機能します。レポートサーバー、Windowsサービス、およびwebAppはすべて同じサーバー上にあります
レポートサイトの設定でユーザーに「NTAUTHORITY\SYSTEM」権限を付与し、reportPathをサーバー名(http:/// reportserver / folderName / ReportNameなど)のフルパスに変更しようとしましたが、役に立ちませんでした。他に確認して修正できることを提案してください。ありがとう。