IIS虚拟目录

时间:2013-12-02 10:19:07

标签: asp.net iis

我尝试通过global.asax路由我的PDF文件以检查访问权限。

我为此添加了我的web.config:

<system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

并且

<system.web>
  <httpHandlers>
    <add verb="GET" path="*.pdf" type="Pipeline.TimeHandler, Pipeline" />
  </httpHandlers>
</system.web>

除非我的文件位于IIS虚拟目录中,否则这样可以正常工作。

请求的信息:

您使用的是哪个版本的IIS? 微软-IIS / 7.5

您使用的是集成模式还是经典模式? 它以集成模式运行。

请求是否完全转移到您的处理程序? 我真的没有处理程序,我只是不想使用Integreated处理程序。

是否运行Application_BeginRequest? 不,它甚至没有点击Application_BeginRequest

您是否在IIS中安装了任何非标准ISAPI模块? 不,我想不是。

我将web.config编辑为:

<system.webServer>
  <handlers>
     <add name="ScriptResource.axd_GET,HEAD" path="ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv2.0" />
     <add name="*_AppService.axd_*" path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv2.0" />
     <add name="*.asmx_*" path="*.asmx" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv2.0" />
      <add name="PdfHandler" verb="*" path="*.pdf" type="Pipeline.TimeHandler, Pipeline" />
    </handlers>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

我删除了httpHandlers,我发现了一个错误:

Could not load file or assembly 'Pipeline' or one of its dependencies. The system cannot find the file specified. 

所以我认为问题是`type="Pipeline.TimeHandler, Pipeline"不起作用。但是我应该如何配置使用标准IIS pipline来执行Application_AuthenticateRequest

2 个答案:

答案 0 :(得分:2)

您正在混合集成模式和经典模式配置。在经典模式(system.web)中注册HTTP处理程序时,似乎您的IIS配置为集成模式(在system.webServer中有设置)。

尝试将此添加到您的system.webServer配置部分:

<handlers>
  <add name="SampleHandler" verb="*" path="*.pdf" type="Pipeline.TimeHandler, Pipeline" />
</handlers>

如果这不是您的问题,请提供更多信息:

  • 您使用的是哪个版本的IIS?
  • 您使用的是集成模式还是经典模式?
  • 请求是否完全转移到您的处理程序?它运行Application_BeginRequest吗?
  • 您是否在IIS中安装了任何非标准ISAPI模块?

您可以获得任何其他有用的信息。

请注意,在经典模式下,您还必须设置ASP.NET ISAPI模块以处理所有请求(默认情况下,它只处理对* .aspx,* .asmx等的请求),或者至少添加*。 PDF。

编辑:哦,所以你实际上没有自己的PDF处理程序?在这种情况下,您只需要确保为静态文件运行身份验证(runAllManagedModulesForAllRequests应该足够),并且您必须确保用户实际需要一些权限来读取您的文件。您必须通过配置拒绝访问目录中的文件。例如,您可以将其添加到您的文件所在目录中的web.config中:

<system.web>
    <authorization>
        <deny users="?" />
    </authorization>
</system.web>

这基本上说:拒绝访问所有匿名(即未登录)用户。

答案 1 :(得分:0)

技术上Luaan回答是对的。

在我的具体情况中,事实证明虚拟目录是一个虚拟应用程序,它有自己的管道和一切。所以我只是删除它,并将其添加为虚拟目录,这可以按预期工作。