Mam raport zapisany na serwerze raportującym SQL2005 i chcę zwrócić wyrenderowany plik PDF tego raportu. Stwierdziłem to podczas pracy z lokalnym plikiem * .rdlc (and I've blogged about it), ale nie wtedy, gdy * .rdl znajduje się na serwerze raportowania. Otrzymuję 401 niedopuszczonych błąd na linii ...Przeglądarka raportów SSRS + Poświadczenia ASP.NET 401 Wyjątek
reportViewer.ServerReport.SetParameters(reportDefinition.ReportParameters);
Oto metoda stosowana do renderowania raportu.
public byte[] Render(IReportDefinition reportDefinition)
{
var reportViewer = new ReportViewer();
byte[] renderedReport;
try
{
var credentials = new WindowsImpersonationCredentials();
reportViewer.ServerReport.ReportServerUrl = new Uri("http://myssrsbox", UrlKind.Absolute);
reportViewer.ServerReport.ReportServerCredentials = credentials;
reportViewer.ServerReport.ReportPath = reportDefinition.Path;
// Exception is thrown on the following line...
reportViewer.ServerReport.SetParameters(reportDefinition.ReportParameters);
string mimeType;
string encoding;
string filenameExtension;
string[] streams;
Warning[] warnings;
renderedReport = reportViewer.ServerReport.Render(reportDefinition.OutputType, reportDefinition.DeviceInfo, out mimeType, out encoding, out filenameExtension, out streams, out warnings);
}
catch (Exception ex)
{
// log the error...
throw;
}
finally
{
reportViewer.Dispose();
}
return renderedReport;
}
Kolejną rzeczą, której brakuje, jest klasa WindowsImpersonationCredentials.
public class WindowsImpersonationCredentials : IReportServerCredentials
{
public bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority)
{
authCookie = null;
userName = password = authority = null;
return false;
}
public WindowsIdentity ImpersonationUser
{
get { return WindowsIdentity.GetCurrent(); }
}
public ICredentials NetworkCredentials
{
get { return null; }
}
public override string ToString()
{
return String.Format("WindowsIdentity: {0} ({1})", this.ImpersonationUser.Name, this.ImpersonationUser.User.Value);
}
}
Inne rzeczy może trzeba wiedzieć ...
- To jest uruchomiony w intranecie i personifikacji jest włączona.
- Rejestrowanie wskazuje, że użytkownik podszywania się jest ustawiony prawidłowo.
- Ten działa podczas pracy w Visual Studio (
http://localhost:devport
), a działa gdy działa na moim komputerze rozwoju (http://localhost/myApplication
). To nie działa podczas pracy na naszych testowych lub produkcyjnych serwerach. - Próbowałem rozwiązań zarówno zi bez system.net.defaultProxy ustawienia w web.config. Żaden nie zadziałał.
Co robię źle? Czy to ustawienie serwera? Czy to kod? Czy to jest web.config?
Czy użytkownik personifikacji mieć dostęp do serwera raportu - tego sprawozdania, w szczególności? – NYSystemsAnalyst
Czy próbowałeś używać IIS pod użytkownikiem podszywania się na swoim komputerze (localhost), aby dokładniej emulować to, co dzieje się na serwerze testowym? Wygląda na to, że z użytkownikiem podszywającym się na serwer raportowania lub bazę danych serwera raportowania powstaje problem z zezwoleniami. Zakładam, że użytkownik podszywania się jest kontem domeny. –
@NYSystemsAnalyst - Tak, użytkownik podszywania się ma dostęp do odpowiedniego katalogu na serwerze raportów. –