Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Telerik报告从未经身份验证的操作Url加载ExternalStyleSheet xml_C#_Asp.net Mvc_Authentication_Telerik Reporting - Fatal编程技术网

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类中。我更新了描述并包含了屏幕截图。您将看到流被传递到样式表。