【问题标题】:Server.TransferRequest returns blank page on specific serverServer.TransferRequest 返回特定服务器上的空白页
【发布时间】:2010-06-17 09:30:30
【问题描述】:

我遇到了一个似乎与配置有关的问题。

我有一个基于 MonoRail 的 web 应用程序,我们利用 MonoRail 的路由功能。在应用程序启动后的第一个请求中,路由未初始化。为了避免这种情况,我在 Application_OnError() 中有以下代码:

public virtual void Application_OnError()
{
    if ( // identified as routing error )
    Server.TransferRequest( Context.Request.RawUrl, false );
    return;
}

在我们的开发服务器(运行 server 2008 R2,带有 IIS 7.5 和 .NET 3.5)上存在问题很好。

这可能是什么原因?如果 Application_OnError() 中的代码抛出异常,那么预期的输出是什么?

我已验证以下内容:

  • 访问日志显示一个条目,我不确定 TransferRequest 在成功调用时是否会显示为第二个条目
  • 该应用程序实际上根据我的内部日志做了一些工作,它不会死掉,因为后续请求可以完美运行(因为路由将处于活动状态)

任何关于寻找什么的提示将不胜感激!

【问题讨论】:

    标签: asp.net error-handling iis-7.5 castle-monorail


    【解决方案1】:

    服务器安装上的应用程序池是否配置为使用集成管道?需要它才能使Server.TransferRequest 工作。

    来自 MSDN 文档:

    此方法用于在 IIS 7.0 中以集成管道模式运行时,以允许在使用正确的请求上下文执行目标请求时将请求处理从一种资源类型转移到另一种资源类型。

    【讨论】:

    • 不错的建议,但是应用程序池设置为集成,所以情况并非如此,抱歉。
    【解决方案2】:

    我认为存在抛出错误,但您看不到它,因为您的页面已准备好出现其他错误您需要以这种方式捕获它。之后你就可以找到真正的问题了,因为从我对 TransferRequest 的检查来看,很多人认为会出错。

    public virtual void Application_OnError()
    {
        if ( identified as routing error )
        {
            try
            {    
                Server.TransferRequest( Context.Request.RawUrl, false );
            }
            catch(Exception x)    
            {
                LogTheError(x.ToString());
            }
        }
    
        return;
    }
    

    【讨论】:

      【解决方案3】:

      您可能需要在 Application_OnStart() 期间设置您的路由,以便为您的第一个请求及时注册路由。

      http://www.castleproject.org/monorail/documentation/trunk/advanced/routing.html
      http://www.kenegozi.com/blog/2009/02/10/monorail-routing-and-the-homepage-routing-rule.aspx

      你现在在哪里注册路由?

      其他建议

      这里还有一些关于 CompleteRequest 和 URL 重写的内容:
      http://msmvps.com/blogs/luisabreu/archive/2007/10/09/are-you-using-the-new-transferrequest.aspx
      http://support.microsoft.com/kb/817036

      一个建议是改用 Request.Redirect。

      【讨论】:

      • 我今天在 Application_OnStart() 中注册了它们,我认为第一个触发应用程序启动的请求有一个漏洞,其中 RoutingModuleEx 实际上是在应用程序启动之前调用的(因此,不重写第一个请求)。我认为它只有在 web.config 中定义路由时才能正常工作,而不是在代码中。
      • 我真的不记得我们为什么使用 Server.TransferRequest,但我认为它是为了让访问者透明,但仍然通过所有可用模块调用请求。 Response.Redirect 可能会起作用,但这应该起作用,因为它“在我的机器上工作”
      【解决方案4】:

      您应该研究的一件事是 Server.ClearError()。 Win 7 和 Server 2008 有一些重大变化,包括管道和错误。

      http://mvolo.com/blogs/serverside/archive/2007/12/08/IIS-7.0-Breaking-Changes-ASP.NET-2.0-applications-Integrated-mode.aspx

      查看列表中的第 21 项。

      不确定这是否是您的问题,但似乎值得检查。

      【讨论】:

      • 嗯,但我的开发机器是 Win 7(可以工作),而舞台服务器是 2008 R2(失败)。我认为这些版本应该几乎相同?
      • 我猜测 2008 R2 和 Win 7 之间的变化可能没有被发现。在 2008 机器(非 R2)上尝试并查看您是否仍有此问题可能会很有趣。我猜你可能不会。
      猜你喜欢
      • 2014-11-26
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 2016-05-19
      • 2017-11-20
      相关资源
      最近更新 更多