【问题标题】:Why are Content, Scripts served as static and other directories not?为什么 Content, Scripts 用作静态目录而其他目录不是?
【发布时间】:2015-01-09 16:13:49
【问题描述】:

所以这有点像asp.net,我觉得太多人不理解。也就是说,我不明白,我问了一堆人/谷歌,似乎也没有人知道具体细节。

默认情况下,ASP.Net 应用程序会将 Content 和 Scripts 目录中的文件作为静态内容提供。事实上,如果我创建其他目录,我认为它也会在这些目录中提供静态内容。

但是,某些目录的内容将不会被提供 - 例如典型的 Asp.Net Mvc Controllers 目录。此外,您始终可以在 asp.net(或 OWIN 处理程序)中配置路由,这些路由将获取某些路由,但也不会。

似乎任何地方都没有配置任何东西。我有我的怀疑,但我真的不清楚作为静态内容提供的内容以及 asp.net 处理的内容的确切规则是什么?

【问题讨论】:

    标签: asp.net iis static-content


    【解决方案1】:

    我一直觉得这张图很有帮助:http://www.4guysfromrolla.com/images/step2.gif

    具体来说,该图中提到的 HttpHandler 对应于 .NET Web 项目根目录中 Web.Config 文件的这一部分:

    <system.webServer>
        <handlers>
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <remove name="OPTIONSVerbHandler" />
          <remove name="TRACEVerbHandler" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
    

    该标签的path 属性可用于配置仅由某个类处理的某些目录。到那时,IIS 会将 HTTP 请求传递给适当的类,以及适当的上下文和线程等。我的猜测是,如果您使用多个框架运行 IIS,每个框架都有一个与其添加处理程序标记关联的不同路径。

    此外,IIS 有自己的默认设置,用于将哪些文件扩展名映射到哪些处理程序类。这些也可以在 IIS 管理界面中进行修改,因此即使您的 web.config 中缺少它,您的超级有用的操作团队也可能会在那里为您添加。不过,归根结底,是 url-HttpHandler 类之间的关系决定了静态文件还是动态文件。

    编辑:

    在此 ServerFault 答案中概述了另一组标签:

    https://serverfault.com/questions/175499/serving-cs-csproj-files-on-iis7-5

    这描述了在文件扩展名上操作的&lt;add fileExtension=".cs" allowed="false" /&gt; 标记,而不是整个路径上的模式。这就是不允许提供以.cs.csproj 结尾的文件的原因。此外,由于您正在安装 IISExpress,因此您应该知道它使用的配置文件与标准 machine.config 不同。该文件的路径在此答案中进行了描述:

    Where is the IIS Express configuration / metabase file found?

    所有这一切都被自托管的概念弄糊涂了,也就是没有 IIS。我相信 Nancy 可以做到这一点,ServiceStack 也可以。我没有这样做的经验,但他们处理路径的方式可能有点不同。

    【讨论】:

    • 没有运营团队。我提到的事情是通过全新的 Windows+VS 安装和 iisexpress 开箱即用的。 web.config 中没有任何异常,也没有提及任何特定路径。如果默认情况下在 machine.config 级别上配置了某些内容,我不知道它会是什么,因为您可以从任意命名的目录中提供内容(而且我从未在 machine.config 中看到过类似的内容)。我完全理解 OWIN 和自托管的东西是如何处理这个问题的,这并不神秘,但 IIS 管道对我来说有点问号。
    • 我明白了,我误解了最初的问题,因为它不是关于如何为控制器提供服务,而是关于为什么 *.cs 文件不作为静态内容提供服务。这肯定是由这个答案中的信息处理的:serverfault.com/questions/175499/… 并在 machine.config 中寻找 fileExtension 可能会指向正确的行。
    • 我明白了。所以你说它是基于文件扩展名而不是基于文件夹?所以基本上,在 IIS 中内置的路由中,. 有什么神奇之处?另外,不确定 cs 和其他文件的配置位置。我的 web.config 没有什么特别之处,ls C:\Windows\Microsoft.NET\Framework\ -rec -inc machine.config | Get-Content | Select-String -Pattern fileExten 没有给我任何东西。
    • 试试ls C:\Windows\Microsoft.NET\Framework\ -rec -inc machine.config | Get-Content | Select-String -Pattern .cs,我不会真的称它为魔法,因为您系统上的大多数文件都有. 字符,这样做的目的是不提供某些文件在网站文件夹中。
    • 这将找到任何带有cs 的东西,因为-Pattern 的arg 是一个正则表达式。相反ls C:\Windows\Microsoft.NET\Framework\ -rec -inc machine.config | Get-Content | Select-String -Pattern '\.cs' 仍然没有出现。至于其中包含.s 的文件,是的,他们经常这样做,但这与文件无关,它与routes 有关,并且据我所知,路由可以完全合法地包含. 字符,所以我仍然不知道具体的规则是什么。
    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多