代码之家  ›  专栏  ›  技术社区  ›  3Dave

ASP.NET MVC eurl.axd错误

  •  30
  • 3Dave  · 技术社区  · 15 年前

    使用以下步骤:

    (我检查过了) this similar post ,这并不能解决我的问题。)

    1. 在WindowsServer2003/iis6下,我创建了一个名为“testapp”的新站点。
    2. 在VS2010中,我创建了一个新的ASP.NET MVC 2应用程序。
    3. 我添加了一个名为“信息”的视图,代码如下:

      <h2>System</h2>
      
      <h3>Request</h3>
      
      <%
          foreach (string key in Request.Headers)
          {
              Response.Write(string.Format("<p>{0}={1}</p>"
                      , key
                      , Request.Headers[key])
                      );
          }
      
      
      %>
      

    除了标准的报头,我还看到了这个:

       X-REWRITE-URL=/home/info/eurl.axd/e3299f29f8043d4f8a27e0f1d0c40971
    

    我正在使用 Helicon ISAPI Rewrite 3 ,它正在生成“x-rewrite-url”头。

    我的问题是:在哪里 /eurl.axd?.... 来自何方?我见过 this article ,但由于这是新文件夹中带有新应用程序池的空白应用程序,因此此Web文件夹中没有运行2.0.*应用程序。没有指向其他目录等的虚拟文件夹。该站点配置为ASP.NET 4.0,并且已正确注册。

    问题是eurl.axd在我的MVC路由中使用了参数。

    “ASP.NET 4.0 Breaking Changes”文章中的选项对我来说并不适用,因为这个应用程序中没有任何2.0组件,我需要使用无扩展URL。

    更新 我刚刚注意到gac中的system.web.mvc是2.0.0.0版本。是否应该通过安装VS2010和4.0框架将其更新为4.0?

    我不明白为什么在默认的ASP.NET MVC 2应用程序中看到这个错误。救命!!

    更新2/2011-已解决

    在最后尝试通过注册表黑客禁用无扩展URL之后,问题就消失了。我发现禁用无扩展URL会使无扩展URL起作用(在iis6中使用通配符映射),这是违反直觉的,但我会尽我所能。

    更新12/2014

    (圣诞光明节宽扎节十二月)。

    我忘了提到其他所有的Windows更新都会破坏注册表的更改。这似乎是一个奇怪的问题, http://site.dom/bob 会失败,而 http://site.dom/bob/ 会成功的。玩得高兴!(注意后面的斜线。)

    3 回复  |  直到 10 年前
        1
  •  43
  •   Speck    13 年前

    这是Microsoft的方法的一部分,它允许在IIS 6中默认情况下由ASP.NET v4处理无扩展URL。这里描述的是 ASPNET V4 Breaking Changes 文件。(在该文档中搜索eurl.axd)。这只在aspnet v4中发生。

    发生的是:

    1. aspnet_filter.dll ,实现aspnet的全局isapi筛选器(右键单击“网站文件夹”>属性以查看它)检查每个传入的URL。对于那些没有扩展名的URL,aspnet会管理要插入的URL /eurl.axd/some-long-number 进入它。实际上,长数字是一个没有破折号的guid。

    2. 您的URL重写器是一个特定于站点的ISAPI过滤器,运行next并查看损坏的URL。因为您的规则不期望URL中注入了那个奇怪的序列,所以重写过滤器不能正确地处理它,用户最终可能得到404。

    当安装IIS6和ASPNetv4时,任何重写过滤器(Helicon Isapi ou Rewrite、IIRF等)都会发生这种情况。它也可能发生在其他的ISAPI过滤器上——那些不是显式重写器的过滤器。

    什么微软 打算 发生:

    1. aspnet_filter.dll文件 ISAPI 滤波器 将/eurl.axd/some-long-number添加到无扩展URL。(如果URL中有一个扩展名,它会将其单独保存,从而节省命中托管代码的性能。)这只是为了在其中获得“.axd”,因此iis6在其默认配置中将映射到 aspnet_isapi.dll ISAPI 延伸 (应用)。

    2. 这个 aspnet_isapi.dll文件 ISAPI 应用 获取请求,通过删除 /eurl.axd/一些长数字 ,并将其传递给设计用于处理无扩展URL的ASP.NET代码。该代码处理请求,但没有意识到/eurl.axd/some-long-number的恶作剧曾经发生过。

    Microsoft未能考虑在步骤1和2之间检查URL的ISAPI筛选器会发生什么情况。《ASP.NET 4发行说明》中有一条有关.NET 2.0应用程序导致此错误的说明;这只是一种可能发生此错误的方法。

    您有一些选择:

    • 使用注册表项将其关闭。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0 dWord EnableExtensionlessUrls 0 ,然后重新启动IIS。

    • 在ASP.NET管道中执行URL重写。(显然,在这种情况下,您只能重写托管请求。)

    • 在全局级别以高于的优先级安装ISAPI筛选器URL重写器 aspnet_filter.dll文件 . 听起来像是我的痛苦。

    • 将网站配置为使用aspnet v2,而不是aspnet v4。

    • 在重写器中插入一个规则,以完全忽略其中包含eurl.axd的URL。这可能和
      RewriteRule eurl\.axd -

    我使用注册表项,它对我来说很好。

    祝你好运!

    2011-08-10更新: Windows更新服务.NET框架似乎重置了注册表项,必须重新应用它。

    编辑2012-02-17 我们遇到了这个问题,我们的团队花了几个小时的时间来解决这个问题,直到有人发现这个问题被隐藏在评论中,然后为我们完成了解决方案。 请注意,对于WOW64(即在64位操作系统上运行的32位工作进程),此注册表项必须设置在HKEY_local_machine\software\WOW6432node\microsoft\asp.net\4.0.30319.0\enableExte__nsionlessurls。

        2
  •  17
  •   marapet    14 年前

    我使用以下regex作为 第一 规则与 IONICS ISAPI重写器 对于运行在上的网站 ASP.NET 4 IIS 6 解决 breaking change 与ASP.NET 4一起引入:

    RewriteRule ^(.*)/eurl.axd/[a-f0-9]{32}(.*)$ $1$2
    

    这让我再次使用无扩展URL。

    请注意,第二组捕获查询字符串(如果存在),并将其重新定位到重写的URL。

    是的,它是 a feature, not a bug .

        3
  •  1
  •   jack    14 年前

    我遇到了一个类似的问题,并通过我们的ISAPI重写模块提供程序找到了一个解决方案。我记录了发现和解决方案: http://www.vanadiumtech.com/OurBlog/post/2011/08/12/Cause-of-eurlaxd.aspx