0

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など)のフルパスに変更しようとしましたが、役に立ちませんでした。他に確認して修正できることを提案してください。ありがとう。

4

1 に答える 1

0

NT Authority\Systemローカルシステムアカウントです。別のマシンのリソースにアクセスすることはできません。また、このアカウントにアクセスできないようにローカルリソースが保護されている場合もあります。したがって、このアカウントに別のマシン(SQLサーバーなど)でアクセス許可を付与している場合、サービスを実行しているアカウントと実際には同じアカウントではありません。

ドメインユーザーの資格情報を使用してサービスを実行してみてください。そのユーザーにSSRSの適切な権限を設定します。

于 2012-11-16T15:51:57.933 に答える