【问题标题】:Routing goes nuts on asp .net mvc 2 application that is the same app set up 2x on the same server路由在 asp .net mvc 2 应用程序上发疯,这是同一应用程序在同一台服务器上设置 2x
【发布时间】:2011-04-04 11:22:51
【问题描述】:

这听起来很奇怪。我有一个 ASP .NET MVC 2 应用程序。效果很好。路由不是很复杂。我在 Windows 2003 IIS 6 上运行它,所以我必须使用 {controller}.aspx 路由配置。

无论如何,我已经在 IIS 的不同虚拟目录下设置了两次相同的 MVC 2 应用程序。这实际上是将现有应用程序文件复制/粘贴到新目录。虚拟目录/应用名称当然各不相同。

路由在原始应用程序中完美运行。第二,我似乎无法让登录页面发布到登录发布操作,更不用说超越了。

我的应用程序中最复杂的 url 类似于:

http://server:90/appName/controller.aspx/AnAction?StartPeriod=2008

我的 global.asax.cs 看起来像:

        routes.IgnoreRoute("{resource}.html/{*pathInfo}");
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",
            "{controller}.aspx/{action}/{id}",
            new { controller = "Account", action = "LogOn", id = UrlParameter.Optional }
          );

        routes.MapRoute(
          "Root",
          "",
          new { controller = "Account", action = "LogOn", id = "" }
        );

该应用程序只有 2 个控制器:Account 和 Mpa。同样,完全相同的编译代码存在于同一 IIS 服务器上不同应用程序名称/虚拟目录下的两个位置。谁能想到我在复制的行为中会出现不同行为的原因(除了显示帐户控制器的登录页面之外的几乎所有内容都不起作用/找不到视图/抛出 404)?

编辑 1

另一件值得一提的是,我在 Mpa.aspx 控制器中的所有 post 方法上都使用了 ValidateAntiForgeryToken 属性。这是在发布到 Account.aspx 之后应该重定向到的控制器(这似乎并没有真正发生)。我认为问题在于用于 ValidateAntiForgeryToken 的盐值对于两个应用程序都是相同的,因为我复制并粘贴了。我已经更改了原始应用程序的值,但仍然得到相同的结果。

FYI: Here are the details returned from firebug. 

    **GET Account.aspx**
    http://server:90/MpaDemo/Account.aspx 200 OK 2.9 KB 15ms

    ParamsHeadersPostPutResponseCacheHTML
    Response Headersview source
    Date    Thu, 26 Aug 2010 20:42:57 GMT
    Server  Microsoft-IIS/6.0
    X-Powered-By    ASP.NET
    X-AspNet-Version    2.0.50727
    X-AspNetMvc-Version 2.0
    Set-Cookie  ASP.NET_SessionId=z1q43ezg2hvtx255i5y5df21; path=/; HttpOnly
    Cache-Control   private
    Content-Type    text/html; charset=utf-8
    Content-Length  2921
    Request Headersview source
    Host    server:90
    User-Agent  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 (.NET CLR 3.5.30729)
    Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language en-us,en;q=0.5
    Accept-Encoding gzip,deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive  115
    Connection  keep-alive
    Authorization   NTLM TlRMTVNTUAADAAAAGAAYAHoAAAAYABgAkgAAAAoACgBIAAAADgAOAFIAAAAaABoAYAAAAAAAAACqAAAABYKIogUBKAoAAAAPdABtAGsAbgBiAGIAMAAwADUAagB4AGIATQBTAEoAQQBLAE0ATwBMADIANAAxADAAOADIJ4z3L+WAUAAAAAAAAAAAAAAAAAAAAABhigoN+1bIPZirxXzNQHWNIu/rx4Senq8=


    **Account.aspx POST**

    Date    Thu, 26 Aug 2010 20:44:26 GMT
    Server  Microsoft-IIS/6.0
    X-Powered-By    ASP.NET
    X-AspNet-Version    2.0.50727
    X-AspNetMvc-Version 2.0
    Location    /MpaDemo/Mpa.aspx/CustomErrorView?aspxerrorpath=/MpaDemo/Account.aspx
    Cache-Control   private
    Content-Type    text/html; charset=utf-8
    Content-Length  200
    Request Headersview source
    Host    SERVER:90
    User-Agent  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 (.NET CLR 3.5.30729)
    Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language en-us,en;q=0.5
    Accept-Encoding gzip,deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive  115
    Connection  keep-alive
    Referer http://SERVER:90/MpaDemo/Account.aspx
    Cookie  ASP.NET_SessionId=z1q43ezg2hvtx255i5y5df21

    **GET CustomErrorView**

    Response Headersview source
    Date    Thu, 26 Aug 2010 20:44:26 GMT
    Server  Microsoft-IIS/6.0
    X-Powered-By    ASP.NET
    X-AspNet-Version    2.0.50727
    Cache-Control   private
    Content-Type    text/html; charset=utf-8
    Content-Length  1534
    Request Headersview source
    Host    server:90
    User-Agent  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 (.NET CLR 3.5.30729)
    Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language en-us,en;q=0.5
    Accept-Encoding gzip,deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive  115
    Connection  keep-alive
    Referer http://server:90/MpaDemo/Account.aspx
    Cookie  ASP.NET_SessionId=z1q43ezg2hvtx255i5y5df21

【问题讨论】:

  • 当您点击登录按钮时,它实际发布到哪里?使用 Firefox 中的 Firebug 找出答案。
  • 嘿@mare。踢自己没有考虑到这一点。 Firebug 说它应该发布到 Account.aspx;但是,当出现问题时,会立即向我的 CustomErrorView 发出 Get 请求,这是我事实上的错误页面。这个页面实际上并没有显示出来。 404 是此 URL 获取请求的状态。我的 post 操作中有一行应该写入日志文件,但从未发生过,因此 Post 似乎并未真正完成。 Post to Account.aspx 的状态为 302 Found。
  • 请注意,在我的其他网站上一切正常,Account.aspx 的发布状态为 200 OK。
  • 这必须是特定于操作系统和 IIS 的,非常奇怪,除非有人已经遇到此问题并解决了它,否则调试将是过度的。

标签: c# asp.net-mvc asp.net-mvc-2 routing


【解决方案1】:

也许从 IIS 6 切换到 IIS Developer Express,它应该在 2003 上运行并支持所有新的 MVC 功能。

引自 ScottGu 的网站:

•它适用于 Windows XP 和更高版本的操作系统 - 为您提供适用于所有操作系统平台的完整 IIS 7.x 开发人员功能集

http://weblogs.asp.net/scottgu/archive/2010/06/28/introducing-iis-express.aspx

http://blogs.iis.net/vaidyg/archive/2010/07/06/introducing-iis-developer-express.aspx

Download

【讨论】:

  • 我很欣赏这个建议,但我们无法真正更改服务器上的 IIS,因为此应用程序将在 Windows 2003 / IIS 6 机器上投入生产。 IIS Dev Express 不适合生产使用。
  • 它尚未准备好投入生产,但可能需要几个月甚至更早,因此值得对其进行测试。
【解决方案2】:

好吧,这很烦人。我忘了检查我复制的文件夹的权限。显然,尝试写入日志并且无法引发错误,我的 try/catch 块捕获了该错误,但随后在 catch 中,我尝试记录错误,该错误引发了另一个错误,这是我的一般捕获所有页面应该有的捕获,但没有,因为 web.config 将它放在另一个控制器下。

叹息

长话短说,我删除了共享错误页面的控制器要求,如下所示:

以前:defaultRedirect="~/Mpa/CustomErrorView" 现在是:defaultRedirect="~/CustomErrorView"

错误页面的视图位于 Views 文件夹的 Shared 目录中。

最后,我为我的日志文件夹添加了正确的权限。

现在一切正常。

哇。这花了我6个小时才弄清楚。我觉得真的,真的很蹩脚。

【讨论】:

  • 我理解你的感受,但它确实发生了。每次它发生时,你都会发现你真的需要开始跳出框框思考,从极端的意义上说,所以也许下一次它会发生时,你将能够想到最不可能的选择解决你的问题;)
  • 不开玩笑。不过感谢您的帮助。我从萤火虫那里得到了一些用处,所以这将对未来有所帮助。这是您知道事情应该正常工作的情况的主要示例。我不应该沿着路由路径走……从一开始就没有任何意义。如果我只是退后一步考虑一下,而不是像疯子那样尝试随机的事情,那么权限将是主要的候选人。再次感谢您的帮助!
猜你喜欢
  • 2018-04-25
  • 2016-09-05
  • 1970-01-01
  • 2012-12-31
  • 2019-10-29
  • 2010-11-11
  • 1970-01-01
  • 2015-07-12
  • 2021-01-29
相关资源
最近更新 更多