【问题标题】:Deployed Mvc app won't work部署的 Mvc 应用程序不起作用
【发布时间】:2012-01-23 16:14:32
【问题描述】:

我在发布 asp.net mvc3 应用程序时遇到了一些问题。部署时,应用程序失败并显示“找不到路径'/Dashboard/Alarmes' 的控制器或未实现 IController”,其中警报是 DashboardController 处的操作。不确定它是否与它有关,但 Alarmes 返回一个 Json 结果。

我注意到的另一件事是,一些在同一解决方案中被另一个项目引用的程序集没有部署(仅当我在 mvc 项目本身中引用它们时)。

对这些有什么建议吗?

更新:

路线注册:

 public static void RegisterRoutes(RouteCollection routes) {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.IgnoreRoute("{*allpng}", new { allpng = @".*\.png(/.*)?" });
            routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
            routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}");

            routes.MapRoute("Default", "{controller}/{action}/{id}", new {
                controller = "Dashboard",
                action = "Index",
                id = UrlParameter.Optional
            });
        }

动作:

public ActionResult Alarmes() {
    var alarmesPorPonto = new Dictionary<string, List<Ponto>>();
    var alarmes = _repositorioDeAlarmes.Pesquise(ObtenhaInicio(), DateTime.Today);

    foreach (var alarme in alarmes) {
        var tipo = alarme.Tipo;
        var ponto = alarme.Ponto;

        if (!alarmesPorPonto.ContainsKey(tipo.Nome)) {
            alarmesPorPonto.Add(tipo.Nome, new List<Ponto>());
        }

        if (!alarmesPorPonto[tipo.Nome].Contains(ponto)) {
            alarmesPorPonto[tipo.Nome].Add(ponto);
        }
    }

    return Json(alarmesPorPonto.Select(a => new { Tipo = a.Key, a.Value.Count }), JsonRequestBehavior.AllowGet);
    }

另一个缺失的信息:我正在将此应用程序部署到一个虚拟目录。

更新 2

完整的控制器类:

public class DashboardController : Controller {
        private readonly IRepositorioDeAlarmes _repositorioDeAlarmes;
        private readonly bool _enableMap;      

        public DashboardController(IRepositorioDeAlarmes repositorioDeAlarmes) {
            _repositorioDeAlarmes = repositorioDeAlarmes;
            _enableMap = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableMap"]);            
        }

        public ActionResult Index() {
            ViewBag.EnableMap = _enableMap;
            return View();
        }

        public ActionResult Alarmes() {
            var alarmesPorPonto = new Dictionary<string, List<Ponto>>();
            var alarmes = _repositorioDeAlarmes.Pesquise(ObtenhaInicio(), DateTime.Today);

            foreach (var alarme in alarmes) {
                var tipo = alarme.Tipo;
                var ponto = alarme.Ponto;

                if (!alarmesPorPonto.ContainsKey(tipo.Nome)) {
                    alarmesPorPonto.Add(tipo.Nome, new List<Ponto>());
                }

                if (!alarmesPorPonto[tipo.Nome].Contains(ponto)) {
                    alarmesPorPonto[tipo.Nome].Add(ponto);
                }
            }

            return Json(alarmesPorPonto.Select(a => new { Tipo = a.Key, a.Value.Count }), JsonRequestBehavior.AllowGet);
        }
}

【问题讨论】:

  • 你能发布你的路由配置代码和DashboardController代码吗?
  • 你能发布你的控制器类定义吗?包含此控制器的程序集是否存在于已部署网站的 bin 文件夹中?
  • @Darin 是的。页面本身可以访问,但是对操作 Alarmes 的调用失败。

标签: asp.net-mvc-3 deployment


【解决方案1】:

我怀疑您在调用操作而不是使用 url 帮助程序时在 javascript 中硬编码了 url。

所以你写道:

<script type="text/javascript">
    $.getJSON('/Dashboard/Alarmes', function(result) {
        ...
    });
</script>

代替:

<script type="text/javascript">
    $.getJSON('@Url.Action("Alarmes", "Dashboard")', function(result) {
        ...
    });
</script>

如果您的应用程序托管在虚拟目录中,这将生成正确的 url,这将是:

<script type="text/javascript">
    $.getJSON('/MyAppName/Dashboard/Alarmes', function(result) {
        ...
    });
</script>

【讨论】:

  • @Fernando,有时症状足以提供诊断。当您说 Index 操作工作正常但不是您通过 AJAX 调用的 Alarmes 操作时,只有当您将应用程序部署在虚拟目录中时才会发生这种情况,我很清楚。
【解决方案2】:

如果您尝试清理 ASP.Net 临时文件并重新启动 Web 服务器会怎样? [{windows-path}\Microsoft.NET\Framework{framework-version}\Temporary ASP.NET Files]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多