none
请问如何设置可以让IHttpHandler拦截对pdf文件的处理? RRS feed

  • 问题

  • 我用VS.net 2008,Debug的时候在内部server上(就是localhost:端口号的情况)可以拦截,但是,使用IIS做服务器的时候(就是使用IIS做服务器的时候)就无法拦截。

    我以为aspnet_isapi.dll本身不处理pdf文件,所以把.pdf文件格式放入了IIS->配置->映射中,但是还是在内部Server可以拦截,在IIS做服务器的时候无法拦截。

    敬请高手指点!

    我的文件:

    web.config文件:

    <httpHandlers>
          <remove verb="*" path="*.asmx"/>
    <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          <add verb="*" path="*.pdf" type="Test1.PDFHandler, Test1, Version=1.0.0.0"/>   
    </httpHandlers>

    我的拦截的CS文件。
    using System.Web;

    namespace Test1
    {
        public class PDFHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
        {
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }

            public void ProcessRequest(HttpContext context)
            {
                bool reportFlg = false;
                try
                {
                    string strFileName = string.Empty;
                    if (HttpContext.Current.Request.Path.IndexOf("ShowReportPDF.pdf") != -1)
                    {
                        strFileName = HttpContext.Current.Session["PDF"].ToString();
                        reportFlg = true;
                    }
                    else
                    {
                        strFileName = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.Path);
                    }

                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.ContentType = "application/pdf";
                    HttpContext.Current.Response.AddHeader(
                                        "Content-Disposition", "inline; filename=SampleFile.pdf");
                    HttpContext.Current.Response.WriteFile(strFileName, true);
                    HttpContext.Current.Response.Flush();
                    HttpContext.Current.Response.End();
                }
                catch (System.Exception)
                {
                }
                finally
                {
                    if (reportFlg)
                    {
                        if (HttpContext.Current.Session["PDF"] != null)
                        {
                            HttpContext.Current.Session.Remove("PDF");
                        }
                    }
                }
            }
        }
    }

    我的测试的页面
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test_Print_PDF.aspx.cs" Inherits="Test1.Test_Print_PDF" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" runat="server">
    </head>
    <body>
        <form id="form1" runat="server">
      <p style="margin-top:-40px;margin-bottom:0px;"> 
      <object  id="pdf1"  width="100%"  height="600px" classid="clsid:CA8A9780-280D-11CF-A24D-444553540000"> 
      <param  name="src"  value="ShowReportPDF.pdf"> 
      </object> 
      </p>
        </form>
    </body>
    </html>

    后台的aspx.cs

    namespace Test1
    {
        public partial class Test_Print_PDF : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                Session["PDF"] = "C:\\PDF\\上海PDA11\\RPDA1101_20091123101311.pdf";
            }
        }
    }
    2009年11月23日 6:51

答案