IIS7 file mappings - .asax, .ashx, .asap

4



IIS让我们能够配置Asp.Net文件映射。因此,除了aspx之外,当请求具有以下文件扩展名时,IIS还会调用Asp.Net运行时:

a) .ascx --> .asmx扩展名用于请求用户控件。

  • 由于无法直接访问用户控件,那么为什么和如何会有人发送请求到用户控件呢?

b) .ashx --> 此扩展名用于HTTP处理程序。

• 但是,为什么要直接请求.ashx页面,而不是在配置文件中注册此处理程序,并使其在请求具有某些(非ashx)扩展名的文件时被调用?

• 此外,由于可能已注册多个Http处理程序,如果它们都使用ashx扩展名,Asp.Net将如何知道要调用哪个处理程序?

• 请求的ashx文件包含什么?也许是一个Http处理程序类的定义?

• 我知道如何注册Http处理程序以在请求非ashx页面时调用它们,但是如何为ashx页面注册Http处理程序呢?



c) .asax --> 这个扩展名用于请求全局应用程序文件

• 为什么我们要直接调用Global.asax?

• 我认为当请求Global.asax时,会创建一个派生自HTtpApplication类的对象,但这次没有进行网页处理?



谢谢




除了Asp.Net能够请求global.asax进行编译之外,我是否有其他理由选择直接请求扩展名为.asax的文件呢?


• ashx文件不需要注册。它们基本上是一个更简单的aspx,在您不需要整个页面生命周期时使用。常见用途是从数据库检索动态图像。

因此,如果我编写Http处理程序,则应将其放在具有.ashx扩展名的文件中,并且Asp.Net将构建一个HttpHandler对象,类似于它如何从.aspx文件构建页面实例?


如果黑客试图请求这些文件之一,你希望发生什么?当然,你不希望IIS将其视为文本文件并将应用程序源代码发送到浏览器。Asp.Net可以像处理.cs、.csproj、.config、.resx、.licx、.webinfo文件类型一样处理它们。也就是说,它会向IIS注册这些文件类型,以便可以明确地防止用户访问这些文件。


•即使您不希望浏览器请求某个资源,也不意味着您不想让asp.net引擎处理该资源。这些扩展名也是ASP.Net为网站模型站点编译文件的方式。

但是为什么Asp.Net不允许直接请求.cs、.csproj、.config、.resx、.licx和.webinfo文件呢?



a) 和 c) - 据我所知,它们没有暴露给任何外部请求进行处理

我的书声称这两个被映射在IIS中



我感激你的帮助

编辑:

b) .ashx扩展名在配置文件中定义,但不是web.config文件,而是machine.config文件

<add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />
http://msdn.microsoft.com/en-us/library/bya7fh0a.aspx

为什么使用.ashx: 不同之处在于处理.ashx的.NET类读取.ashx文件中的Page指令,以将请求映射到指定在该指令中的类。这样可以避免为每个处理程序都在web.config中放置显式路径,从而导致非常长的web.config。

我认为Http处理程序类是在.ashx文件内定义的,但实际上扩展名为.ashx的文件只包含Page指令?

我并不完全确定是否理解正确:假设我们有十个Http处理程序,我们想通过向IIS7发出请求来调用它们。我认为每个Http处理程序都将有特定的.ashx文件-->因此,如果对FirstHandler.asxh进行请求,则将调用该文件内指定的处理程序?

另一个编辑:

我必须承认,我仍然有点不确定ashx扩展名。

我意识到通过使用它,例如可以创建'hey.ashx'页面,其中Page指令将告诉哪个类(Http处理程序)在请求'hey.ashx'时调用--因此无需在web.config中注册Http处理程序。

但是,如果您以这种方式使用Http处理程序,则只有在请求具有.ashx扩展名的文件时才会调用它们。因此,如果我希望为具有其他扩展名(例如.sourceC)的文件调用Http处理程序,则仍需要在web.config中注册Http处理程序?!

4个回答

4
一些要点:
  • asmx文件不同于ascx文件。您可以将它们用于Web服务(SOAP),而不是Web控件。
  • ashx文件不必注册。它们基本上是一个更简单的aspx,用于不需要整个页面生命周期的情况。常见用途是从数据库检索动态图像。
  • 如果黑客尝试请求其中一个文件,您希望发生什么?您肯定不希望IIS将其视为文本文件并将应用程序源发送到浏览器。
  • 仅因为您不希望浏览器请求资源,并不意味着您不希望该资源由asp.net引擎处理。这些扩展名也是ASP.Net选择编译Web站点模型站点文件的方式。

更确切地说,“.aspx.ashx更复杂” ;) - Mehrdad Afshari

3

a) 和 c) - 就我所知,它们不会处理任何外部请求。

b) 默认情况下,它将查找所请求的路径/名称的 .ashx 文件。这使得向网站添加处理程序非常容易,无需进行任何配置。

更新:在 a 中,您还提到了 asmx。我的理解是该书正在解释一些与 ajax 相关的功能,并附有以下注释:

  • Asp.net 不允许发出指向 .ascx 的请求。
  • 您可以向 Web 服务 (.asmx) 发出请求以获取信息。
  • 有一些内置功能可帮助您完成上述操作。

.asm文件是Web方法,可以直接访问。 - missaghi
@rizzle 是的,但他在谈论用户控件(ascx)。 - eglasius
@rizzle,实际上,在你的评论之后,你几乎可以确定他正在阅读的书是讲解如何进行Ajax请求,因此在信息的同一段落中出现了ascx和asmx。 - eglasius

2

a) .ascx文件不能直接访问,因为默认处理程序是System.Web.HttpForbiddenHandler类。

<add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />

.asmx文件可以直接调用,它们是Web方法(虽然通常需要进行POST请求,除非在web.config中指定允许GET)。

b) .ashx扩展名在配置文件中已定义,但不是在web.config中,而是在machine.config中。

<add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />

http://msdn.microsoft.com/zh-cn/library/bya7fh0a.aspx

为什么使用.ashx:与其他处理程序不同的是,处理.ashx文件的.NET类会读取该文件中的Page指令,将请求映射到该指令中指定的类。这样可以避免为每个处理程序都在web.config中设置显式路径,从而使web.config变得非常冗长。

--

c) Global.asax:我不使用global.asax,而是使用非常优雅的HttpModule解决方案,但这可能是为了向具有global.asax文件的旧网站进行过渡设置的。


禁止向 global.asax 发送请求。 - eglasius

2
为了消除您对asp.net如何处理这些请求的任何困惑,请检查以下位置中的web.config:
%systemroot%\Microsoft.NET\Framework\v2.0.50727\CONFIG
正如您所看到的(我在下面发布了我的),asp.net排除了几乎所有您不确定是否正在接收特殊处理的文件。请注意,其中包括*.cs、*.acsx和*.asax等文件。
<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"/>

另外,请记住,IIS可能没有配置将某些请求(MIME类型)映射到ASP.NET管道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接