C# Telerik报告从未经身份验证的操作Url加载ExternalStyleSheet xml
我从一个单独的项目中创建了一个C# Telerik报告从未经身份验证的操作Url加载ExternalStyleSheet xml,c#,asp.net-mvc,authentication,telerik-reporting,C#,Asp.net Mvc,Authentication,Telerik Reporting,我从一个单独的项目中创建了一个Telerik报告。 我有ASP.NET MVC项目中的报表查看器来加载报表 代码如下: private ViewResult ReportViewer(Report report) { report.ExternalStyleSheets.Clear(); var serverUrl = UrlExtension.BaseUrl(); var relativeUrl = Url.Action("ReportStyleSheet", "Th
Telerik
报告。
我有ASP.NET MVC项目中的报表查看器来加载报表
代码如下:
private ViewResult ReportViewer(Report report)
{
report.ExternalStyleSheets.Clear();
var serverUrl = UrlExtension.BaseUrl();
var relativeUrl = Url.Action("ReportStyleSheet", "Theme");
var url = string.Format("{0}{1}", serverUrl, relativeUrl);
var styleSheet = new ExternalStyleSheet(url);
report.ExternalStyleSheets.Add(styleSheet);
return View("ReportViewer", report);
}
来自主题控制器的操作ReportStyleSheet
需要身份验证
成功登录并尝试查看报表后,报表无法访问/Theme/ReportStyleSheet。但是,当我从浏览器运行Url时,它是经过身份验证的。我如何解决这个问题
它使用表单身份验证
尝试将MemoryStream传递给ExternalStyleSheet构造函数时,发生了一个错误,该错误表示在处理报表“MyReport”时发生了一个错误:缓冲区不能为null。参数名称:缓冲区
。我确信那条小溪已经过去了。以下是截图:
确保您已在web.config文件中配置了身份验证,以避免应用程序不明确。将找到身份验证的类型。请注意,您没有启用其他身份验证。请查看。它写得不好,但对我来说,样式表似乎是在调用后立即加载的
var styleSheet = new ExternalStyleSheet(url);
因此,它由web服务器(运行web页面的应用程序池用户)调用。此用户未通过身份验证,这是您出现问题的原因
我建议您将样式表带到一个不需要身份验证的位置,或者使用另一个不从Uri加载的ExternalStyleSheet构造函数重载
根据你的截图和下面评论中的对话,我创建了类似的类
public class MyReport : Telerik.Reporting.Report
{
public MyReport(string stylesheet)
{
this.ExternalStyleSheets.Clear();
using (System.IO.Stream s = new System.IO.MemoryStream(File.ReadAllBytes(stylesheet)))
this.ExternalStyleSheets.Add(new ExternalStyleSheet(s));
}
}
它起作用了。也许您应该使用System.Text.Encoding.UTF8.GetBytes(styles)
或从文件加载样式表。也许这与样式表编码有关。我的是utf-8。您的身份验证是如何配置的?登录后是否成功访问其他视图或控制器(需要身份验证)?使用表单身份验证。是,可以访问需要验证的其他页面。请将如果条件也放在视图中。为了更好地理解,我更新了问题的描述。需要对其进行验证,因为xml样式表中的样式基于用户组织的设置是动态的。如果只有一个接受xml字符串的构造函数,那就更容易了。@h3n好的,那么当您执行ReportViewer操作时,您知道要为其提供样式表的组织的标识吗?如果是这样的话,我建议使用construstor with stream参数并将正确的样式表作为stream加载。我将其添加到报表构造函数中,出现了一个错误,该错误表示:处理报表“MyReport”时出错:缓冲区不能为null。参数名称:bufferthis.ExternalStyleSheets.Clear();使用(System.IO.streams=new System.IO.MemoryStream(System.Text.Encoding.ASCII.GetBytes(styles)))this.ExternalStyleSheets.Add(new ExternalStyleSheet)@h3n您确定内存流中有样式表吗?我尝试使用文档从telerik报告包的发票示例导出样式表。似乎可以从绝对路径加载样式表。因此,我准备了一个new Report()
,并使用var stylesheet=newexternalstylesheet(新Uri(@“c:\invoice.xml”))加载了样式表代码>。我还尝试使用您评论中的代码加载该文件。它也起作用了。样式表包含在Report类中。我更新了描述并包含了屏幕截图。您将看到流被传递到样式表。