Ich habe einen Bericht auf einem SQL2005-Berichtsserver gespeichert und möchte eine gerenderte PDF-Datei dieses Berichts zurückgeben. Ich habe das bei der Arbeit mit einer lokalen * .rdlc-Datei (and I've blogged about it) herausgefunden, aber nicht, wenn sich die * .rdl auf einem Berichtsserver befindet. Ich erhalte einen 401 nicht autorisiert Fehler an der Linie ...SSRS-Berichtsanzeige + ASP.NET-Anmeldeinformationen 401 Ausnahme
reportViewer.ServerReport.SetParameters(reportDefinition.ReportParameters);
Hier ist die Methode verwendet, um den Bericht zu machen.
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;
}
Die andere Sache, die Sie vermissen, ist die Klasse 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);
}
}
Andere Dinge, die Sie wissen müssen ...
- Dieses in einem Intranet ausgeführt wird, und Identitätswechsel aktiviert ist.
- Die Protokollierung zeigt an, dass der Identitätswechselbenutzer ordnungsgemäß eingerichtet wurde.
- Diese funktioniert, wenn in Visual Studio (
http://localhost:devport
) ausgeführt wird, und es funktioniert, wenn auf meinem Entwicklungsfeld (http://localhost/myApplication
) ausgeführt wird. Es funktioniert nicht wenn auf unseren Test- oder Produktionsservern ausgeführt wird. - Ich habe versucht Lösungen mit und ohne system.net.defaultProxy Einstellungen in web.config. Keine funktionierte.
Was mache ich falsch? Ist es eine Servereinstellung? Ist es Code? Ist es web.config?
Hat der Identitätswechsel Benutzer hat Zugriff auf den Berichtsserver - dieser Bericht insbesondere? – NYSystemsAnalyst
Haben Sie versucht, IIS unter dem Identitätswechsel-Benutzer auf Ihrem Dev-Computer (localhost) auszuführen, um näher zu emulieren, was auf Ihrem Testserver passiert? Es klingt wie ein Problem mit dem Identitätswechsel mit dem Identitätswechsel-Benutzer gegenüber dem Berichtsserver oder der Berichtsserver-Datenbank. Ich nehme an, der Identitätswechsel-Benutzer ist ein Domänenkonto. –
@NYSystemsAnalyst - Ja, der Identitätswechselbenutzer hat Zugriff auf das entsprechende Verzeichnis auf dem Berichtsserver. –