【问题标题】:ASP.NET MVC RouteExistingFiles questionASP.NET MVC RouteExistingFiles 问题
【发布时间】:2011-03-09 17:13:13
【问题描述】:

似乎 ASP.NET MVC 3 会在查看路由表之前先处理现有文件。这可以通过设置选项routes.RouteExistingFiles = true 来关闭。当它设置为不路由现有文件时,它似乎不提供所有文件。例如,如果一个文件被命名为 *.cs,它将不会被提供。如果文件重命名为 .txt,它将被提供。我发现这相当随意,我无法找到任何关于提供什么和不提供什么的文档。将静态文件服务添加为路由表中的条目应该会好得多,带有 StaticFileRouteHandler 类或类似的东西。有没有人有关于这个主题的更多信息或细节?我想完全控制我的应用程序是否提供服务。

P.S:我使用的是 ASP.NET 开发服务器。

【问题讨论】:

    标签: c# asp.net-mvc-3


    【解决方案1】:

    例如,如果一个文件被命名为 *.cs,它将不会被提供

    您可以查看c:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config 文件的<httpHandlers> 部分。我的看起来像这样:

    <httpHandlers>
        <add path="eurl.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
        <add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True" />
        <add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
        <add verb="*" path="*_AppService.axd" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False" />
        <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False"/>
        <add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
        <add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />
        <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />
        <add path="*.asmx" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False" />
        <add path="*.rem" verb="*" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="False" />
        <add path="*.soap" verb="*" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="False" />
        <add path="*.asax" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.master" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.skin" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.browser" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.sitemap" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.dll.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True" />
        <add path="*.exe.config" verb="GET,HEAD" type="System.Web.StaticFileHandler" validate="True" />
        <add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.csproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.vb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.vbproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.webinfo" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.licx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.resx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.resources" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.mdb" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.vjsproj" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.java" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.jsl" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.ldb" verb="*" type="System.Web.HttpForbiddenHandler"  validate="True" />
        <add path="*.ad" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.dd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.ldd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.sd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.cd" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.adprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.lddprototype" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.sdm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.sdmDocument" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.mdf" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.ldf" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.exclude" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.refresh" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
        <add path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False"/>
        <add path="*.rules" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
        <add path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False"/>
        <add path="*.xamlx" verb="*" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False"/>
        <add path="*.aspq" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
        <add path="*.cshtm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
        <add path="*.cshtml" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
        <add path="*.vbhtm" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
        <add path="*.vbhtml" verb="*" type="System.Web.HttpForbiddenHandler" validate="True"/>
        <add path="*" verb="GET,HEAD,POST" type="System.Web.DefaultHttpHandler" validate="True" />
        <add path="*" verb="*" type="System.Web.HttpMethodNotAllowedHandler" validate="True" />
    </httpHandlers>
    

    所以你可以看到所有那些被禁止的扩展。它们对应于源代码文件,出于安全原因,不直接提供。否则人们将能够查看您的源代码文件。

    如果您想为它们提供服务,您可以编写一个控制器操作来为这些文件提供服务。

    【讨论】:

      【解决方案2】:

      我想说 IIS 控制提供哪些文件,并取代 MVC 路由表条目规定的内容。

      如果您想提供 .CS 文件,您可能需要在 IIS 中调整 MIME 类型。

      尝试添加一个 .cs 扩展名 mime 类型并将文件类型设为 text/cs。

      【讨论】:

      • 这是正确的。将提供的文件类型存在限制。 .cs 文件绝对在受限列表中,除非您在 IIS 中另外指定。
      • 在这种情况下我没有使用 IIS,想知道这是从哪里获取的。原来它来自 .NET Framework 文件夹中的 web.config。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      相关资源
      最近更新 更多