MVC和<location>元素</location>的疯狂IIS错误

时间:2012-06-08 20:56:03

标签: asp.net asp.net-mvc iis web-config

我试图深入了解导致我所看到的特别奇怪错误的原因。我已将此问题隔离如下:

使用两个基本控制器创建一个ASP.Net MVC应用程序。

public class HasLocationController : Controller
{
   public ActionResult Index()
   {
      return View();
   }
}

public class NoLocationController : Controller
{
   public ActionResult Index()
   {
      return View();
   }
}

为web.config添加一个位置元素,用于路径'HasLocation'

<location path="HasLocation">
   <system.web>
      <authorization>
         <allow users="*"/>
      </authorization>
   </system.web>
</location>

将网站发布到IIS6或IIS7 (IISExpress和WebDevServer无效),并尝试使用以下链接进行浏览:

http://[yourdomain]/NoLocation/%20~C:/blah.txt

http://[yourdomain]/HasLocation/%20~C:/blah.txt

对于没有配置相应位置元素的控制器,您将获得所期望的异常消息。


Exception From Controller Without Location Element


但是,如果您使用location元素在控制器上尝试相同的操作,那么您会收到这个奇怪的错误:

注意:这只发生在前导波形符(〜)字符处。没有它,你会得到你期望的正常错误。


Error When Using Location Element


我无法真正找到有关此错误的文档,但我很想知道为什么会发生这种情况,以及如何防止它。

你能解决这个问题的任何亮点都会有所帮助。

2 个答案:

答案 0 :(得分:3)

互联网上有关于此错误的数百个答案。很可能它与你的控制器无关,但有:

  

〜C:/blah.txt

特别是:它可能发现有潜在危险。看看HttpRuntimeSection.RequestPathInvalidCharacters

至于第二个错误。这是正确的,您的项目中不存在目录HasLocation。创建时,您将收到第一个错误。当您删除:时,它将尝试在HasLocation目录中加载您请求的任何文件。

注意:您不能将web.config中的location元素用于安全性MVC应用程序控制器,您需要使用AuthorizeAttribute或其他类似的自定义属性。

Here is a Reference任何对SO或Google的搜索都会说同样的事情:

  

您无法使用路由或web.config文件来保护您的MVC应用程序。保护MVC应用程序唯一受支持的方法是使用带有[Authorize]属性的基类,然后让每个控制器类型为基类型的子类。

重申最新情况:

第一次出错:由于HttpRuntimeSection.RequestPathInvalidCharacters,您的网址引发了错误。

第二次错误:如果您有控制器,则无关紧要。默认的ASP.Net Webforms引擎正在尝试检测是否存在您在url中指定的目录(在您的情况下是一个名为 HasDirectory 的目录),因为它需要授权Webforms引擎的目录访问权限您在web.config位置元素中指定的。它甚至不担心该文件。由于此目录不存在,因此您会得到与图像状态完全相同的错误(我以绿色突出显示):

Highlighted Error

如果您创建目录,则会收到错误#1。

整个ASP.Net运行时都是这样的:

  1. 解析请求所需的路径。
  2. 如果目录存在于web.config位置元素中,则验证对目录的任何授权。
  3. 如果它具有访问权限,请获取该文件并解析它的任何内容(aspx等)
  4. 如果它没有访问 AND ,则文件存在抛出异常或按配置重定向。
  5. 如果文件不存在,请忽略web.config中的location元素并运行IIS catch all以确定是否存在another route for the request

答案 1 :(得分:0)

我相信网址中的波形符号会诱使虚拟路径提供商在物理磁盘上查找该控制器。