ReportViewer - "无法序列化会话状态。在' stateserver'和' sqlserver'模式

时间:2012-10-05 09:36:51

标签: asp.net reporting-services reportviewer report-viewer2010

我在Web应用程序中使用VS2010 Report Viewer控件。应用程序sessionstate模式设置为StateServer,如下所示

    <sessionState timeout="30" mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" />

reportviewer控件在我的devlopment机器上运行正常但是当应用程序部署到服务器上并且加载了reportviewer控件页面时,会抛出以下错误..所有其他页面都正常工作。

&#34;无法序列化会话状态。在&#39; StateServer&#39;和&#39; SQLServer&#39;在模式下,ASP.NET将序列化会话状态对象,因此不允许使用不可序列化的对象或MarshalByRef对象。如果自定义会话状态存储在&#39;自定义&#39;中进行类似的序列化,则适用相同的限制。 。模式&#34;

任何人都可以帮忙,任何想法都会有很大的帮助..

提前致谢。


rptvw.ProcessingMode = ProcessingMode.Remote;
        rptvw.ServerReport.ReportServerUrl = new Uri("http://localhost:90/reportserver");
        rptvw.ServerReport.ReportPath = string.Format("/Reports/{0}", reportName);

        var param = new ReportParameter[4];

        param[0] = new ReportParameter("Parameter1", DropDownListCodes.SelectedValue));
        param[1] = new ReportParameter("Parameter2", DropDownListQuarters.SelectedValue));
        param[2] = new ReportParameter("Parameter3", DropDownListComparators.SelectedValue));
        param[3] = new ReportParameter("Parameter4", comptype);

        rptvw.ServerReport.SetParameters(param);

        rptvw.ServerReport.Refresh();

1 个答案:

答案 0 :(得分:1)

我设法让它发挥作用。 我按照此链接查看了我的解决方案msdn link

“实现IReportServerCredentials接口时,重要的是要知道ReportViewer控件在ASP.NET会话中存储对象的实例。如果服务器的ASP.NET会话存储在进程外,例如在Reporting Services中,该类必须标记为Serializable,以便它可以序列化以便存储。“取自上面的链接。

在App_Code \ ReportServerConnection.cs

中创建了一个新文件
[Serializable]
public sealed class ReportServerConnection : IReportServerConnection2
{
    public bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority)
    {
        authCookie = null;
        userName = null;
        password = null;
        authority = null;

        // Not using form credentials
        return false;
    }

    public WindowsIdentity ImpersonationUser
    {
        // Use the default Windows user.  Credentials will be
        // provided by the NetworkCredentials property.
        get { return null; }
    }

    public ICredentials NetworkCredentials
    {
        get
        {
            // Read the user information from the web.config file. By reading the information on demand instead of 
            // storing it, the credentials will not be stored in session, reducing the vulnerable surface area to the
            // web.config file, which can be secured with an ACL.

            // User name
            string userName = ConfigurationManager.AppSettings["ReportViewerUser"];

            if (string.IsNullOrEmpty(userName))
                throw new InvalidOperationException("Please specify the user name in the project's Web.config file.");

            // Password
            string password = ConfigurationManager.AppSettings["ReportViewerPassword"];

            if (string.IsNullOrEmpty(password))
                throw new InvalidOperationException("Please specify the password in the project's Web.config file");

            // Domain
            string domain = ConfigurationManager.AppSettings["ReportViewerDomain"];

            if (string.IsNullOrEmpty(domain))
                throw new InvalidOperationException("Please specify the domain in the project's Web.config file");

            return new NetworkCredential(userName, password, domain);
        }
    }

    public Uri ReportServerUrl
    {
        get
        {
            string url = ConfigurationManager.AppSettings["ReportServerUrl"];

            if (string.IsNullOrEmpty(url))
                throw new InvalidOperationException("Please specify the report server URL in the project's Web.config file");

            return new Uri(url);
        }
    }

    public int Timeout
    {
        // set timeout to 60 seconds
        get { return 60000; }
    }

    public IEnumerable<Cookie> Cookies
    {
        // No custom cookies
        get { return null; }
    }

    public IEnumerable<string> Headers
    {
        // No custom headers
        get { return null; }
    }
}

}

在Report.aspx.cs页面上

    protected void Page_Init(object sender, EventArgs e)
    {
        rptvw.ServerReport.ReportServerCredentials = new ReportServerConnection();
    }

在主帖上的代码中更改了此行 rptvw.ServerReport.ReportServerUrl = rsc.ReportServerUrl;

并在Web.config中

<appSettings>
<add key="ReportViewerServerConnection" value=" App_Code.ReportServerConnection, App_Code"/>
<add key="ReportViewerUser" value="username"/>
<!-- Used as the user name by the ReportServerConnection class. -->
<add key="ReportViewerPassword" value="password"/>
<!-- Used as the password by the ReportServerConnection class. -->
<add key="ReportViewerDomain" value="domainname"/>
<!-- Used as the domain by the ReportServerConnection class. -->
<add key="ReportServerUrl" value="http://localhost:90/reportserver"/>
<!-- Used as the report server URL by the ReportServerConnection class. -->