【问题标题】:Response.BinaryWrite gives error on ProductionResponse.BinaryWrite 在生产中给出错误
【发布时间】:2010-12-06 13:09:02
【问题描述】:

我正在使用 localReport 打印 PDF (SQL REPORTVIEWER)。它在本地主机上运行良好。当我将应用程序移至生产(64 位 Windows 2008)时,它给了我一个错误。 (见下文)

我将渲染字节放入 USERCONTROL 的 Session 中,然后执行 window.open('Program1.aspx')...

在 Program1.aspx 的页面加载中,我尝试检索 Session 变量并处理.... 我认为这个语句会导致错误“Response.BinaryWrite (...) etc”。

它适用于我的本地电脑(Vista 32 位)...

有人可以请教错误的内容吗?以及如何在生产中解决这个问题??????

谢谢你..

USERCONTROL1.ASCX

byte[] 渲染字节;

        renderedBytes = localReport.Render(
            reportType,

            deviceInfo,

            out mimeType,

            out encoding,

            out fileNameExtension,

            out streams,

            out warnings);

 Session["report"] = Print.RenderReport(listEnt, Language);

PROGRAM2.ASPX

    protected void Page_Load(object sender, EventArgs e)
    {

        string extension = "PDF";

        Response.ContentType = "application/pdf";

        // set the MIME type here

        Response.AddHeader("content-disposition", "inline: filename=Test." + extension);

        Response.BinaryWrite((byte[])Session["report"]);
        Response.End();

    }

“/”应用程序中的服务器错误。 你调用的对象是空的。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

来源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[NullReferenceException:对象引用未设置为对象的实例。] System.Web.HttpResponse.BinaryWrite(Byte[] 缓冲区) +13 ConfederatieBouw.CustomModules.Controle_InhoudingsPlicht.WebForm1.Page_Load(对象发送者,EventArgs e)+191 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,对象 o,对象 t,EventArgs e)+14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(对象发送者,EventArgs e)+35 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive() +50 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsync

【问题讨论】:

  • 你不应该设置 Session["report"] = renderBytes 吗?否则,为什么要设置该变量而不使用它?
  • 好点 willvv,但即使该函数返回的不是 byte[],它也不是直接的问题,因为用户得到了 NullReferenceException。如果他们试图投射不是 byte[] 的东西,他们将得到 InvalidCastException。一旦他们清除了当前的错误,这完全有可能是他们得到的下一个错误。

标签: c# asp.net reporting-services


【解决方案1】:

您是否在生产环境中运行网络农场?如果是这样,您如何存储会话状态?默认值为 InProc,这意味着会话将仅存在于场中的一台服务器上,如果后续请求转到另一台服务器,则可以解释问题。要修复这种情况,您需要设置某种可以跨服务器共享的会话状态(例如会话状态服务器或 SQL Server 会话状态)。

以下是有关各种会话状态提供程序的一些信息: http://msdn.microsoft.com/en-us/library/ms178586.aspx

【讨论】:

  • 它不在网络农场中。顺便说一句: Print.RenderReport(listEnt, Language) 在静态类函数中并返回“renderedBytes”并放入会话变量中。 Session["report"] 应该包含 byteArray。然后我打开一个 ASPX 页面并尝试检索 Session["report"] 并执行我发布的 Page_load 中的代码。我花了一段时间才让这个在 Dotnetnuke 中工作。因为 dotnetnuke 使用用户控件。所以它与更新面板发生冲突......但是像这样我让它在Localhost中工作...... PDF在我身边提示。但为什么不在生产中......还有什么原因?
  • 可以远程调试吗?如果是这样,那可能会让您更快地得到答案。我以前从未使用过 dotnetnuke,它会以某种方式劫持会话导致问题吗?
  • 嗨,Brian,这是一个很好的观点。我希望我知道如何进行远程调试?我已经在服务器上安装了remotedebugger,但是不知道怎么做?
  • 从这里开始:msdn.microsoft.com/en-us/library/bt727f1t.aspx。基本上,一旦您在远程机器上安装并运行它,您就可以附加到它调试 -> 附加到进程。在窗口的顶部,有一个 Qualifier 选项,这是要附加到的服务器,除此之外,它像正常一样进行调试。您必须拥有一些权限才能执行此操作。它应该在上面的链接中。
【解决方案2】:

会话[“报告”] 为空。您没有将其设置为用户控件中的 renderBytes 。

另外,将它存储在 Session 中是一个非常糟糕的主意。每当您设置 Session[] 值时,您的二进制数据必须被序列化/编码,然后反序列化/未编码,这表现不佳。在用户控件上创建一个属性以接受报表对象并将其写入那里的输出流,或者只是在页面本身中执行。无论如何,我不确定将它放在用户控件而不是规则类中是否有意义。

【讨论】:

  • 嗨大卫,谢谢,但这是我的第一个想法并写了,但在运行时我得到了类似在 App_Code 中找不到的东西,并提到了下面的 codeSubdirectories 或其他......因为它是 DOtnetnuke。所以我不得不为它创建一个单独的页面。 codeSubDirectories>
猜你喜欢
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2015-10-30
  • 1970-01-01
相关资源
最近更新 更多