【问题标题】:Why won't my MVC project work after publishing it?为什么我的 MVC 项目在发布后无法运行?
【发布时间】:2010-07-03 17:49:20
【问题描述】:

我最近将我的第一个 MVC 2 项目发布到了一个商业 Web 服务器,运行 Windows 2008,据称它支持其他 MVC 站点没有问题,但遇到了一些问题。这是项目的高级结构。如您所见,它非常简单:

但是,在网站发布后,我导航到 URL,我得到“HTTP 错误 403.14 - 禁止:Web 服务器配置为不列出此目录的内容。”

因此,我就此事联系了网络主机,并被告知我必须包含一个默认登录页面,例如 Default.aspx、Index.aspx 等。我怀疑此响应是否准确,因为我认为 MVC 路由会采用照顾这个,但我还是按照建议做了,在 Default.aspx.cs 代码隐藏中添加了一个重定向到我的主控制器,但得到了 HTTP 错误 404。我根据类似于本文中的建议添加了重定向:@987654321 @。

一个多星期以来,我一直在与网络主机商来回讨论这个问题,收到了大约十几个不同的回复和答案,但我还没有找到解决办法。我确定这是一件很容易解决的事情,但我不知道接下来要尝试什么,或者向他们接下来尝试的网络托管支持建议什么。

太棒了……我知道 StackOverflow 社区比我聪明,而且我的网络托管公司的支持技术加起来一千倍,我希望你能帮助我在这里解决问题,这样我就可以成功发布我的项目并毫无错误地访问它。

【问题讨论】:

  • 我根本没有更改 htaccess 文件。最终,我计划在稍后尝试将 SEO 最佳实践应用到该网站时这样做,但我还没有达到那一点。我是否需要更改 htaccess 文件才能使其正常工作?
  • 是否在 IIS 中设置了通配符应用程序映射并且未勾选“检查文件是否存在”? (实际上可能在 2008 年不需要 - 不记得了)
  • Rup - 感谢您的回复。但是,老实说,我不知道答案。这里的部分问题是我不得不与外包网络托管公司合作,所以我无法访问这样的配置信息。但是,我可以询问它,并向他们提供建议,我会这样做。同时,还有其他可能导致此问题的原因吗?

标签: asp.net asp.net-mvc windows-server-2008 publish


【解决方案1】:

有几件事可能会导致错误:


MVC 库问题

生产服务器可能没有将 MVC 库存储在 GAC 中。 要解决此问题,您只需进入 MVC 项目的 References 窗格/文件夹并找到 System.Web.MvcSystem.Web.RoutingSystem.Web.Abstractions。现在,通过 Ctrl 点击它们来选择它们,然后在属性窗口中将 Copy Local 设置为 true。

在发布到服务器之前很难知道是否是这种情况,因此我建议将程序集设置为始终复制本地。


着陆页

您的登录页面可能有问题。根据我使用 ASP.NET MVC 的经验,我发现 IIS 需要登录页面才能正常运行。我正在使用 ASP.NET MVC 2 模板中包含的页面。您应该将我的与您的进行比较,看看您是否拥有所需的一切:

默认.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="YourNamespace._Default" %>

<%-- Please do not delete this file. It is used to ensure that ASP.NET MVC is activated by IIS when a user makes a "/" request to the server. --%>

默认.aspx.cs:

using System.Web;
using System.Web.Mvc;
using System.Web.UI;

namespace YourNamespace
{
    public partial class _Default : Page
    {
        public void Page_Load(object sender, System.EventArgs e)
        {
            // Change the current path so that the Routing handler can correctly interpret
            // the request, then restore the original path so that the OutputCache module
            // can correctly process the response (if caching is enabled).

            string originalPath = Request.Path;
            HttpContext.Current.RewritePath(Request.ApplicationPath, false);
            IHttpHandler httpHandler = new MvcHttpHandler();
            httpHandler.ProcessRequest(HttpContext.Current);
            HttpContext.Current.RewritePath(originalPath, false);
        }
    }
}

权限

根据您获得的第一个 HTTP 状态代码,可能存在权限问题。 包含您的 MVC 应用程序的文件夹必须定义为应用程序并设置为适当的权限

通过 IIS 完成这两件事非常容易。但是,您可能无权访问 IIS;如果你这样做了,你很幸运!

否则,您可以通过 FTP 使用chmod 命令更改权限。可以通过Filezilla这个非常好的开源FTP客户端进行连接,只需通过右键+对话框即可。

至于将文件夹定义为应用程序,您应该检查是否可以通过主机提供给您的任何IIS东西来完成。如果没有,请联系他们并要求他们进行设置。


祝你好运!希望我能帮上忙。

【讨论】:

  • 天啊……你真是个天才。我已经尝试过你建议的第一步,重新引用。你的第二个建议是神奇的。我无法向你表达我此时此刻的心情。现在,我将真正深入了解问题所在以及您的解决方案如何提供帮助。再次感谢!
  • 啊啊啊……该死。我真的很兴奋,因为主页加载了,这是以前从未工作过的。但是,虽然主页确实加载成功,但我单击的每个链接都会将我带到错误 404 页面。您对导致这种情况的原因有什么想法吗?
  • 查看 Rup 的评论,是通配符应用映射设置不正确。
  • 谢谢,ZippyV。我会看看我是否可以从我的虚拟主机那里获得这些信息,不幸的是,到目前为止,他一直……没有帮助。
  • 我和我的虚拟主机谈过这个问题,他们说不支持通配符映射。我在下面的答案中发布了他们的回复中的详细信息......是否应该很难发布 MVC 项目?我应该只寻找一个新的网络主机吗?那会有什么不同吗?
【解决方案2】:

可能是您的生产 IIS 没有为您的站点加载 MVC 参考文件。当我将 MVC 站点加载到说“我们完全支持 MVC”的主机时,我遇到了同样的问题。您可以尝试使用“所有项目文件”选项进行发布。我相信这个问题也可以通过进入您的引用文件夹并选择 mvc 引用来解决。我现在不在我的开发人员机器上,但我相信您更改了引用的某个属性以将它们包含在您发布的文件中。

【讨论】:

  • 这是个好主意,尽管我想我已经尝试过了。也许我做错了。我所做的是(1)在项目中包含以下引用: System.Web.Routing.dll System.Web.Abstractions.dll System.Web.Extensions System.Web.Mvc ...和(2),设置“将这些引用上的“本地”属性复制为“真”。这听起来像你的建议,还是我做错了?
【解决方案3】:

试试pre-compiling your application。在 Visual Studio 中设置一个部署项目,然后在发布模式下部署它。

因为它是预编译的,所以您不依赖 IIS 来编译项目以供您运行。这就是我这些天一直在做的事情,因为如果我需要强制它重新编译或更新,生产服务器上的 IIS 可能会很痛苦..

【讨论】:

    【解决方案4】:

    根据上面的 cmets 和回复,我最终通过询问我的网络主机是否支持通配符应用程序映射来探索通配符应用程序映射。这是我得到的回应:


    我们的服务不支持通配符映射。

    如果您想使用 URL 重写,这与重新路由相同,请使用下面的示例。

    使用 URL 重写映射的示例,其中以下 URL

    /default.aspx?id=1 将替换为 /default.aspx?id=25

    <rewrite>
    <rewriteMaps>
    <rewriteMap name="/default.aspx?id=1">
    <add key="1" value="25" />
    </rewriteMap>
    </rewriteMaps>
    <rules>
    <rule name="Rewrite rule1 for /default.aspx?id=1">
    <match url=".*" />
    <conditions>
    <add input="{/default.aspx?id=1:{REQUEST_URI}}" pattern="(.+)" />
    </conditions>
    <action type="Rewrite" url="{C:1}" appendQueryString="false" />
    </rule>
    </rules>
    </rewrite>
    
    1. 如果您尝试做的不是 URL 重写而是 URL 重定向,请使用下面的示例。

    使用 ASP 创建文件“default.asp”重定向您的网站。

    将以下代码放入:

    <%
    Response.Status="301 Moved Permanently"
    Response.AddHeader "Location","http://www.new-url.com/"
    %>
    

    使用 HTML 重定向您的网站:

    <HTML><HEAD>
    <META HTTP-EQUIV=Pragma Content="No-Cache">
    <META HTTP-EQUIV=Refresh Content="5;URL=http://YOURURLWHEREYOUWANTTOREDIRECT">
    </HEAD>
    

    上面的任何东西都可以工作吗?说真的,发布一个 MVC 项目就这么难吗?我真的开始感到沮丧...... :(

    我应该只寻找一个新的网络主机吗?那会有什么不同吗?

    【讨论】:

    • 您已经确认导航到您网站的根目录有效(因为它执行 default.aspx)。作为快速修复,您可以将路由从“{controller}/{action}/id”更改为“default.aspx/{controller}/{action}/id”。那应该可以解决它。
    • @ZippyV 的提示应该可行。但你是对的,发布一个 MVC 站点应该不难。就个人而言,我使用 GoDaddy - 发布只是构建 --> 发布(只要您在本地复制 MVC DLL)和 FTP。
    • Maxim Z.,感谢您的评论。您需要做的不仅仅是构建 -> 发布?您还必须 FTP 一些文件吗?你没有这样做,这可能是我的问题吗?无论如何,我想我会继续前进,看看我是否可以从 GoDaddy 获得一个月的托管服务,看看那里是否能取得更大的成功。
    • ZippyV,谢谢你的建议。我试过了,它允许我访问我的一些页面,但不是全部。我没有深入研究它以确定哪些,或者为什么有些而不是其他。不过,确实加载的那些似乎没有应用任何 CSS 样式。我不记得确切,但我想我读到了路由试图访问静态文件或其他东西时可能发生的地方......
    【解决方案5】:

    发送以下请求: http://stackoverflow.com?variableValue=87

    使用查询字符串中的变量值重定向页面 :-

    变暗变量值

    variableValue = Request.QueryString("场合")

    如果变量值 = 87 那么

    Response.Status="301 永久移动"

    Response.AddHeader "Location","http://www.google.com"

    如果结束

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 2013-05-02
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 2020-06-23
      相关资源
      最近更新 更多