【问题标题】:IIS Virtual directoryIIS 虚拟目录
【发布时间】:2013-12-02 10:19:06
【问题描述】:

我尝试通过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

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

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

它是否运行 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

【问题讨论】:

    标签: asp.net iis


    【解决方案1】:

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

    尝试将此添加到您的 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>
    

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

    【讨论】:

    • runAllManagedModulesForAllRequests should be enough 应该但结合模拟和其他东西 Application_BeginRequest & Application_AuthenticateRequest 不被执行
    • @Sirl33tname 你有没有尝试添加我提到的授权配置?否则,它会简单地通过而不调用任何授权,因为默认值是“允许所有人”。
    • 是的,我的 web.config 从一开始就有这个
    • 现在我已经编写了自己的处理程序,但如果我用type="Handler.PdfHandler, ProjektName" 加载它们,我得到一个错误:Could not load file or assembly 'ProjektName' or one of its dependencies. The system cannot find the file specified.
    • @Sirl33tname 如果您正在编写一个网站(而不是一个 Web 项目),程序集名称可能会变得古怪。尝试仅使用短名称,不使用程序集名称(即仅使用“Handler.PdfHandler”)。
    【解决方案2】:

    技术上Luaan 的答案是正确的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2010-09-20
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2011-04-25
      • 2016-10-06
      相关资源
      最近更新 更多