2016-04-21 75 views
0

我有要求從我的MVC 6控制器生成一個SSRS報告服務器端,我目前正在嘗試獲得穩定的解決方案。我遇到了一段時間我的c#代碼會成功通過SSRS報告服務器進行身份驗證,然後突然它會給我401 http響應,而無需進行任何配置或代碼更改,這幾乎就像我已經通過身份驗證並且連接是堅持,然後在一段時間後,它會否認我。今天早上,當我再次開始了我的測試應用程序,我驗證和生成的報告有一個良好的30個礦山開始之前,我得到401級的響應SSRS報告身份驗證間歇性工作

這裏是我的rsreportserver.config文件的設置

<Authentication> 
    <Extension Name="Windows" Type="Microsoft.ReportingServices.Authentication.WindowsAuthentication, Microsoft.ReportingServices.Authorization"/> 
</Authentication> 

<Authentication> 
    <AuthenticationTypes> 
     <RSWindowsNTLM/> 
    </AuthenticationTypes> 
    <RSWindowsExtendedProtectionLevel>Off</RSWindowsExtendedProtectionLevel> 
    <RSWindowsExtendedProtectionScenario>Proxy</RSWindowsExtendedProtectionScenario> 
    <EnableAuthPersistence>true</EnableAuthPersistence> 
</Authentication> 

,這是我如何努力從c#驗證,如果有更好的方法來做到這一點,請等我知道

public async Task<byte[]> Generate 
     (
     string reportServerUrl, 
     string reportData, 
     string username, 
     string password 
     ) 
    { 
     var reportUrl = [email protected]"{reportServerUrl}//ReportServer/Pages/ReportViewer.aspx{reportData}"; 

     using (var handler = new HttpClientHandler { Credentials = new NetworkCredential(username, password, [email protected]"{reportUrl}/") }) 
     { 
      using (var client = new HttpClient(handler)) 
      { 
       client.BaseAddress = new Uri(reportServerUrl); 
       client.DefaultRequestHeaders.Accept.Clear(); 
       client.DefaultRequestHeaders.Add("Authorization", "NTLM"); 
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

       var response = await client.GetAsync(reportUrl); 
       if (response.IsSuccessStatusCode) 
       { 
        return response.Content.ReadAsByteArrayAsync().Result; 
       } 
      } 
     } 

     return null; 
    } 
+0

您可以將用戶憑據存儲在應用設置中,以便在運行所有報告時使用,並在獲取數據時將用戶數據權限作爲報告參數進行管理。另外,您是否嘗試在[Authenticate]的方法上添加合約標記來強制應用程序檢查它是否具有憑據? – Mike

+0

嗨,@ Mmcgowa3,謝謝你的回覆。你有合同標記的示例代碼嗎?我不確定你的意思。 – user65439

+0

我想念說這個標記實際上叫做[Authorize],你可以在控制器類的頂部或單獨的方法中使用該標記。 – Mike

回答

0

的問題是,我試圖通過使正常的HTTP POST和參數與我的憑據到報表服務器一起傳遞給渲染從我的web應用程序的報告。此方法當然可以用於某些報表服務器配置,但不是從C#呈現SSRS報表的正確方式。微軟已經完成了所有艱苦的工作,並提供了可以使用的Web服務端點。令人困惑的是,他們實際上提供了2個端點,每個端點都有其獨特的功能。

對於一步一步的文章如何做到這一點,閱讀How to write a C# wrapper class for the SSRS report service

我CodeProject上的文章下面我給一個快速指導,我做了什麼

一個Web引用添加到

[Your report server host name]/ReportServer/ReportExecution2005.asmx 

現在,創建一個類,利用添加的Web引用的

using System.IO; 
using System.Net; 
using SsrsWrapper.SsrsReportService; 

namespace SsrsWrapper 
{ 
    public class ReportManager 
    { 
     private readonly ReportExecutionService _reportServerExecutionService; 

     public ReportManager(string reportServerWsdlUrl,string username,string password,string domain) 
     { 
      _reportServerExecutionService = new ReportExecutionService 
      { 
       Url = reportServerWsdlUrl, 
       Credentials = new NetworkCredential(username, password, domain) 
      }; 
     } 

     public byte[] Render(string reportDirectory,string reportName,string reportFormat,ParameterValue[] parameters) 
     { 
      _reportServerExecutionService.ExecutionHeaderValue = new ExecutionHeader(); 

      _reportServerExecutionService.SetExecutionParameters(parameters, "en-us"); 

      string encoding; 
      string mimeType; 
      string extension; 
      Warning[] warnings; 
      string[] streamIds; 

      var result = _reportServerExecutionService.Render(reportFormat, @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>", out extension, out encoding, out mimeType, out warnings, out streamIds); 

      return result; 
     } 

     public void Render(string reportDirectory,string reportName,string reportFormat,ParameterValue[] parameters,string destinationPath) 
     { 
      var result = Render(reportDirectory, reportName, reportFormat, parameters); 

      var stream = File.Create(destinationPath, result.Length); 

      stream.Write(result, 0, result.Length); 
      stream.Close(); 
     } 
    } 
} 
-1

添加[授權]合約標記可以解決您的問題。請看下圖:

[Authorize] 
public class ReportController : Controller 
{ 

    public ActionResult RunReport() 
    { 

     return View(); 
    } 
} 
+0

嗨,Authorize屬性與您的報表服務器的身份驗證無關,我的所有控制器上都默認啓用了此過濾器。該屬性用於確保匿名瀏覽器在未經身份驗證的情況下無法擊中您的控制器。這個過程成功後,c#代碼纔會被調用。 – user65439

+0

如果要按用戶過濾數據,那麼對所有報告使用靜態用戶名和密碼,然後使用用戶ID /名稱作爲參數輸入的方法如何? – Mike

相關問題