我在IIS上部署MVC应用程序时得到一个空白页面

时间:2009-02-17 17:01:24

标签: asp.net asp.net-mvc

我目前正在生产服务器上部署使用MVC ASP.NET的RC构建的应用程序,现在什么都没有显示。 我的global.ascx中的路由是典型的,即

routes.MapRoute(
            "Default",                                              // Route name
            "{controller}.aspx/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
        routes.MapRoute(
          "Root",
          "",
          new { controller = "Home", action = "Index", id = "" }
        );

任何人都可以弄明白为什么它只显示空白页

抱歉,我忘了提到它是IIS 6

有趣的是它也在我的本地IIS上工作(即本地内置的VS&标准版XP)

13 个答案:

答案 0 :(得分:19)

如果在global.asax中设置了错误处理设置,并且泛型错误(如无法找到的程序集),您还会得到一个空白页。

在global.asax中禁用它时,您可以看到服务器错误。 修复这些初始错误后,别忘了再次启用它。

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "ErrorController");
    routeData.Values.Add("action", "HandleTheError");
    routeData.Values.Add("error", exception);

    Response.Clear();
    Server.ClearError();

    IController errorController = new ErrorController();
    errorController.Execute(new RequestContext(
        new HttpContextWrapper(Context), routeData));
}

答案 1 :(得分:3)

当特定地方出现错误时会显示空白页面 - 在我的例子中,它是一个MethodNotFoundException ......

要查看错误,请确保在“Web服务器(IIS)角色中启用”HTTP错误“和”HTTP重定向“服务。

答案 2 :(得分:2)

通常当我得到它时,这是因为我在IIS7(或Visual Studio附带的IIS Express 7)上进行开发后,在部署到IIS6时忘记将以下内容添加到Web.config中:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

答案 3 :(得分:1)

我解决了这个问题,主要问题是MVC框架的不同版本。我安装MVC RC1时,Production Server正在使用MVC Beta。因此,只要我在服务器上安装RC1并运行mvc扩展注册脚本,一切正常,感谢您的帮助

答案 4 :(得分:0)

服务器环境是什么?如果它不是IIS7 / Server 2008,那么你需要进行其他调整才能使路由正常工作,尽管如果是这种情况你可能会得到一个错误页面,而不是空白页面。

答案 5 :(得分:0)

如果是生产服务器出现问题,则可能是角色权限。您需要确保应用程序正在使用的所有文件夹和文件允许读取(在某些情况下,如果使用日志,则写入)IIS正在使用的角色标识。

IIS通常使用的身份是在网站属性中 - &gt;目录安全 - &gt;编辑(身份验证和访问控制)。如果您不想允许网络上的任何计算机访问该网站,那么您应该关闭“启用匿名访问”。如果您确实想要允许此操作,那么这将是您在webapp文件夹和文件中访问所需的标识。否则,您可能需要授予对包含您要访问的用户身份的角色的访问权限。

答案 6 :(得分:0)

从它的外观来看,如果你想要一个像/Home.aspx这样的网址,我会期望第一条路由可行,但如果你只是去/ url,那么ASP.net不知道如何处理URL。它将尝试匹配IIS默认页面,如index.html,default.aspx,index.aspx等。如果没有找到任何内容,则请求无法到达任何地方。尝试创建default.aspx(或路由中的任何其他索引文件),然后在page_load中执行response.redirect("~/Home.aspx")

如果这不起作用,我会查看此source。 IIS 6和MVC不能很好用的一个主要原因是IIS 6默认情况下没有将通配符*映射到ASP.net DLL。

我确信这是一种配置产品服务器的方式,您可以在XP实例和生产之间进行任何比较吗?

答案 7 :(得分:0)

您是否在生产服务器上的web.config中定义了HTTP处理程序和模块?

    <httpHandlers>
        <remove verb="*" path="*.asmx"/>
        <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
        <add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </httpHandlers>
    <httpModules>
        <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </httpModules>

在IIS6上,URL必须包含.mvc(例如/Products.mvc/ListAll)。请查看这些指南以了解正确的IIS 6配置和.mvc扩展解决方法:

Deploying ASP.NET MVC to IIS 6

Using ASP.NET MVC on IIS 6 without the .MVC Extension

答案 8 :(得分:0)

这意味着您在MVC应用程序中抛出了异常,但您可能在MVC中有一个捕获,过滤和隐藏这些异常的类。这些例外仍然被抛出,但你不能看到导致它们的原因。 MVC仍然重新路由页面请求,但由于隐藏的异常而没有返回任何内容。在看到抛出异常之前,您无法阻止此问题。在关闭MVC的异常处理过滤器之前,您无法在网页中看到异常。

可能阻止您看到异常的一件事是在网站首次加载时通过global.asax中的MVC过滤器调用的GlobalFilterCollection。您通常可以在Global.asax文件中找到这些调用。该文件通常在网站首次加载及其事件时调用HttpApplication对象。在其事件中,它然后加载到开发人员添加的默认MVC路由中,但也可以加载处理站点范围异常处理的过滤器。开发人员经常通过global.asax中的过滤器来处理异常处理,认为他们智能地处理用户的异常和问题,但这是一个错误。如果您在其中找到过滤器,请将其注释掉。突然之后,您的所有错误都会再次显示在HTML页面中。

然后您可以解决问题!祝你好运!

答案 9 :(得分:0)

在以下情况下也发生了这种情况:

1)我在浏览器接受时添加了一个CompressAttribute来添加Gzip。

response.AppendHeader("Content-Encoding", "gzip");
                    response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);

2)我正在修改输出HTML以更改显示的电话号码:

response.Filter = new OutputHtmlReplacer(response.Filter, phoneNumber);

其中OutputHtmlReplacer是一个继承自MemoryStream的类

所以,解决方案是:

1)验证标题并检查我们是否正在应用压缩。

2)如果是这样,那么新的OutputHtmlReplacer响应过滤器必须由GzipStream包装。

答案 10 :(得分:0)

贾斯汀(Justin)有人遇到与我相同的问题,请尝试监视:

protected void Application_Error(object sender, EventArgs e) {

对我来说,应用程序无声地失败了,我不知道,所以很显然它返回了一个空白,但是令人困惑的部分是返回了200作为http响应状态代码。

无论如何,我希望这对以后的人有所帮助。

答案 11 :(得分:0)

如果在应用程序中创建app_offline.htm文件,请尝试将其删除。

答案 12 :(得分:0)

作为另一种可能的解决方案:

我没有部署一个月左右,但是我通过一些次要版本更新了Visual Studio。 VS Base和我的某些Nuget软件包之间存在不兼容的情况。更新了我的软件包,确保清除(并删除bin / obj-即使它最初不能解决问题),然后重新部署。此后工作。