我尝试通过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版本是什么Microsoft IIS/7.5
您使用集成模式还是经典模式它在集成模式下运行。
请求是否会转移到您的处理程序我真的没有处理程序,我只是不想使用Integrated处理程序。
它是否运行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管道来执行Application_AuthenticateRequest
。
您正在混合集成模式和经典模式配置。您的IIS似乎是在集成模式下配置的(在system.webServer中有设置),而您是在经典模式(system.web)下注册HTTP处理程序。
尝试将其添加到您的系统.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>
这基本上是说:拒绝所有匿名(即未登录)用户访问。
从技术上讲,Luaan的回答是正确的。
在我的具体案例中,事实证明,虚拟目录是一个虚拟应用程序,它有自己的管道和一切。所以我只是删除它,并将其添加为虚拟目录,这正如预期的那样工作。