2012-11-16 131 views
0

我想從Windows服務發送PDF格式的SSRS報告。這對我的本地機器和分段安裝程序很好,但是我在生產環境中遇到了以下錯誤。這似乎是我的一些權限問題,但我無法查明確切的問題。下面是錯誤在Windows服務日誌looged:Windows服務失敗,同時發送報告爲PDF與System.Net.WebException:請求失敗,HTTP狀態401:未授權

<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消息,WebResponse的響應,流responseStream,布爾asyncCall)在System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(字符串方法名,對象[]參數)

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); 
     } 

此方法獲得reportPath像 「文件夾名/所以reportName」。

我也在使用來自webApp的reportViewer控件(在同一臺服務器上)顯示相同的報告,並且在那裏它完美地工作。 我的報告服務器,Windows服務和webApp都在同一臺服務器上

我試圖在報告站點設置中給用戶「NT AUTHORITY \ SYSTEM」權限並將reportPath更改爲帶有服務器名稱的完整路徑(如http:/// reportserver/folderName/ReportName),但這些都沒有幫助。請建議我還能檢查和修復哪些內容。謝謝。

回答

0

NT Authority\System是本地系統帳戶。它無法訪問另一臺計算機上的資源,並且有時會保護本地資源以防止訪問此帳戶。因此,如果您在不同的計算機(例如SQL服務器)上授予此帳戶權限,那麼它與運行您的服務的帳戶不是同一個帳戶。

嘗試使用域用戶的憑據運行您的服務。在SSRS中使用適當的權限設置該用戶。

相關問題