【问题标题】:Server.Transfer throws Error executing child request. How to resolve?Server.Transfer 在执行子请求时抛出错误。如何解决?
【发布时间】:2011-01-22 15:10:27
【问题描述】:

我在 C# 2.0 中有一个 HttpModule,它处理抛出的异常。每当抛出异常时,将调用带有一些查询字符串的错误页面 (aspx)。它是通过Server.Transfer()完成的。

但是当控件尝试执行Server.Transfer()时,抛出如下异常:

执行 [pagename].aspx 的子请求时出错。

Request.Redirect() 工作正常。

我尝试在请求转移到的页面的页面指令中设置EnableViewStateMac="false"。问题依然存在。

这是我试过的代码:

string errorPage = "errorpage.aspx?id=" + someErrorId
HttpContext.Current.Server.Transfer(errorPage,true);

知道如何解决这个问题吗?

【问题讨论】:

    标签: asp.net c#-2.0 server.transfer


    【解决方案1】:

    我找到了 Server.Transfer() 的替代方法

    我用过

     HttpContext.Current.RewritePath("somefile.aspx");
    

    这解决了问题。

    【讨论】:

    • 你是如何使用它的?异常 Error execution child request 消失了,但我得到一个空页面。
    • 你必须在 IHttpModule 中完成。见msdn.microsoft.com/en-us/library/ms972974.aspx(可惜文章太长了,其实概念很简单)。
    • 如果您有Server.Transfer 可用,您可能只需调用Context.RewritePath,而不需要调用HttpContext.Current 来获取HttpContext 对象:)
    【解决方案2】:

    我在 OnPreRequestHandlerExecute 事件中连接到请求管道,发现我无法使用 Server.Transfer,因为它在执行子请求时引发了与您相同的错误。

    使用 HttpContext.Current.RewritePath 不起作用,因为它似乎被忽略了,而且我没有被重定向到任何地方。

    如果您使用的是 IIS 7 及更高版本,则可以使用 Server.TransferRequest 代替,这对我有用。

    这两种方法之间的区别包含在这个答案中:TransferRequest vs Transfer in ASP.Net

    【讨论】:

    • 为我工作。其他答案没有。
    【解决方案3】:

    我的解决方法不同:

    一个在线查询产生了this Microsoft Knowledge Base article,它指出解决方案是使用Response.Redirect而不是Server.Transfer

    我更改了命令,得到了更准确的“404 错误消息”,而不是神秘的“执行子请求时出错”消息。

    这使我检查了重定向字符串,我注意到我的路径已关闭。

    我将传输字符串从“ErrorPage.aspx”修复为“../ErrorPage.aspx”(注意路径更改),Server.Transfer 工作正常。

    【讨论】:

    • 我发现我需要将其更改为“~/ErrorPage.aspx”,否则当我从子目录移动到应用程序根目录时它会停止工作(请参阅我的答案)
    • 我们正在使用 Server.Execute 并收到消息。谢谢!这也是一个 404 错误。
    【解决方案4】:

    如果您在调试过程中碰巧在 VS.NET IDE 中看到此异常,请至少继续一次,然后按 F5 继续调试。在我的情况下,实际页面确实呈现了 ASP.NET 异常,而 确实 导致了问题。在我的情况下,我有一个格式不正确的 asp:ChangePassword 控件实际上导致“执行子请求时出错”异常。

    【讨论】:

    • 我相信这也暴露在异常的InnerException属性中。在我的情况下,这是一个缺少的用户控件。
    【解决方案5】:

    我将 Server.Transfer 更改为 Server.TransferRequest,然后我得到了真正的异常。引用不正确的 ReportViewer 版本是一个问题。

    【讨论】:

      【解决方案6】:

      Server.Transfer("mywebpage.aspx") 似乎仅在会话已经存在时才有效。

      如果没有启动会话,则会抛出此错误,因此您必须使用 Response.Redirect 或其他方法。

      【讨论】:

        【解决方案7】:

        我遇到了同样的问题,发现它与 Server.Transfer 运行位置和重定向到的位置的相对路径有关。就我而言,这是在子目录中执行的,因此@ray 的答案(将 ../ 添加到 URL 的开头)有效。然而,当我在上面的目录中执行时,同样的事情发生了。因此,我改为使用有根路径:

        Server.Transfer("~/errorpage.aspx")
        

        【讨论】:

          【解决方案8】:

          这不是错误,而是设计使然。见http://support.microsoft.com/kb/320439

          【讨论】:

          • 是的,我已经看到了。但我要求不要更改地址栏上的 URL。
          • 他没有重定向到 ASP
          • 无论你重定向到哪里都会发生。
          • 链接文章中的特定用例只是“设计”
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-25
          • 2019-06-14
          • 1970-01-01
          • 2012-12-09
          • 1970-01-01
          相关资源
          最近更新 更多