65.9K
CodeProject 正在变化。 阅读更多。
Home

共享服务器托管环境中的应用程序扩展映射

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.83/5 (4投票s)

2005年7月12日

5分钟阅读

viewsIcon

47908

downloadIcon

339

在特定文件夹中通过登录保护任何文件类型。

Add/Edit Application Extension Mapping Dialog Box

引言

我的 ISP 告诉我,在共享服务器托管包上我无法进行应用程序扩展映射。我负担不起独立服务器,所以我创建了这个示例程序,安装在我正在考虑迁移到的 ISP 上。首先,我给很多 Windows ISP 发了一封售前问题邮件:我需要在文件映射中添加 PDF 扩展名,以便它能被 aspnet_isapi.dll 处理。在我的 ASP.NET 应用程序中,我将所有 PDF 请求重定向到登录屏幕。你们最经济实惠的计划能实现这一点吗?请参阅此处的说明:MSDN。一些 ISP 同意这样做,所以我注册了一个。如果在 30 天试用期内测试程序运行正常,那么一切都好。否则,我将退款并继续列表中的下一个。

背景

ASP.NET 不会保护 ASP 系列以外的文件扩展名。要做到这一点,您需要将扩展名映射到 IIS 中的 ASP 可执行文件。使用 Web.config 文件告诉您的应用程序身份验证模式(Forms)、要监视的扩展名(.PDF)以及谁将处理它(MyHandler.dll)。编写一个 HTTP 处理程序来接收 HTTP 请求并将其通过 ASP 可执行文件(aspnet_isapi.dll)运行。Web.config 会显示 Login.aspx

更多

Install

  1. 解压 AppMapFileTest.zip
  2. 在 IIS 中创建一个虚拟文件夹,指向物理目录(AppFileMapTest.csproj 所在的位置)。
  3. MyHandler.dll 从 MyHandler 的 obj/Debug 目录复制到 AppMapFileTest 的 bin 目录。
  4. 执行第 24 至 43 步。
  5. 在 Visual Studio 中打开 AppMapFileTest.csproj,编译并运行。

从零开始构建

打开 VS.NET:选择“新建项目”。语言:C#。类型:Web 应用程序。名称:AppMapFileTest。

  1. 解决方案资源管理器 - 右键单击 AppMapFileTest - 添加 Web 窗体 - 名称:index.aspx
  2. 从工具箱拖放一个 Label。属性 - TextWelcome
  3. 解决方案资源管理器 - 右键单击 AppMapFileTest - 添加 Web 窗体 - 名称:Login.aspx
  4. 从工具箱拖放一个 Label。属性 - TextUserID
  5. 从工具箱拖放另一个 Label。属性 - TextPassword
  6. 从工具箱拖放一个 TextBox。属性 - TexttxtUserId
  7. 从工具箱拖放一个 TextBox。属性 - TexttxtPassword
  8. 从工具箱拖放一个 Button。属性 - TextLoginNamecmdLogin
  9. 解决方案资源管理器 - 右键单击 index.aspx - 设置为启动页。
  10. 通过运行应用程序进行测试。您应该会看到一个显示“Welcome”的浏览器窗口。
  11. 打开 Windows 资源管理器,在该项目内添加一个名为 scores 的文件夹。
  12. 在 index 页面上,单击页面左下角的 HTML。
  13. <body MS_POSITIONING="GridLayout"> 标签后的那一行创建了两个超链接
    • <a href="example.pdf"target=_blank>Example Page</a>
    • <a href="scores/buynow.pdf"target=_blank>Buy Now</a>
  14. 打开 Windows 资源管理器,将 example.pdf 放在应用程序的根目录中,将 buynow.pdf 放在一个名为 scores 的新文件夹中。我从这里获取了下一个项目的大部分内容。
  15. 启动 VS.NET 的新实例。
  16. VS.NET:新建项目。语言:C#。类型:类库。名称:MyHandler。
  17. 创建一个派生自 IHttpHandler 的类。
    using System;
    using System.Web;
    
    namespace MyHandler
    {
        /// <summary>
        /// Summary description for NewHandler.
        /// </summary>
        public class NewHandler : IHttpHandler
        {
            public NewHandler()
            {
                //
                // TODO: Add constructor logic here
                //
            }
            #region Implementation of IHttpHandler
            public void ProcessRequest(System.Web.HttpContext context)
            {
                string FileName = context.Server.MapPath(context.Request.FilePath);
                context.Response.WriteFile(FileName);
            }
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
            #endregion
        }
    }
  18. 编译此代码,并将 MyHandler.dllbin/Debug 文件夹复制到 AppMapFileTest 应用程序的 bin 文件夹。
  19. 运行 AppMapFileTest 应用程序。这两个链接应该在单独的页面中打开,无需登录。
  20. 打开 web.config
  21. 将行:<authentication mode="Windows" /> 修改为
    <authentication mode="Forms" >
         
        <forms name=".reelbook" loginUrl="Login.aspx"/>
            
    </authentication>
  22. <system.web> 之后,</system.web> 标签之前,添加
    <httpHandlers>
        <add verb="GET" path="scores/*.pdf" type="MyHandler.NewHandler,MyHandler"/>
    </httpHandlers>
  23. </system.web> 标签之后,</configuration> 标签之前,添加
     <location path="scores">
      <system.web>
            <authorization>
                <deny users="?" />
            </authorization>
        </system.web>
       </location>
  24. 测试应用程序。它仍然不需要登录。
  25. 打开“控制面板/管理工具/Internet 信息服务”。
  26. 展开(本地计算机)。
  27. 展开“网站”。
  28. 展开“默认网站”。
  29. 右键单击 AppFileMapTest。
  30. 选择“属性”。
  31. 在“目录”选项卡中,单击“配置”按钮。
  32. 在“应用程序配置”对话框中,单击“添加”按钮。
  33. 在“添加/编辑应用程序扩展映射”对话框中,单击“浏览”。
  34. 在“打开”对话框中,选择文件类型为 .dll,然后导航到 C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 文件夹。
  35. 双击 aspnet_isapi.dll
  36. 在“添加/编辑应用程序扩展映射”对话框中,在“扩展名”文本框中输入 .pdf(不要忘记点)。
  37. 在“Verbs”下,我只需要 GET,所以单击“限制为”单选按钮,并在文本框中输入 GET。
  38. 取消选中“检查文件是否存在”复选框。
  39. 点击“确定”。

    嘿!“确定”按钮是灰色的!经过漫长的 Google 搜索,我发现了这个

  40. 单击文本框本身,路径将完全展开,启用“OK”按钮,这样您就可以保存映射。
  41. 单击“应用”。
  42. 点击“确定”。
  43. 单击“应用”。
  44. 点击“确定”。
  45. 测试应用程序。
    • 单击“Example Page”链接 - 它像以前一样工作。
    • 单击“Buy Now”链接 - 它跳转到 Login.aspx 页面。
    • 单击“Login”按钮 - 无反应。
  46. 在 Visual Studio 中,转到 Login.aspx 的设计视图,然后双击 Login 按钮。
  47. cmdLogin_Click 方法中,添加一行代码
    FormsAuthentication.RedirectFromLoginPage(txtUserId.Text, false);

    运行它。它不支持 FormsAuthentication

  48. 添加一个 using 语句:using System.Web.Security;

    现在它奏效了。您必须登录才能访问“Buy Now”页面。

结论

在我们的 Web.config<authentication mode="Forms" > 标签内定义的名为 reelbook 的会话 cookie 用于您的下次会话,直到下次您不需要再次登录。只有在“添加/编辑应用程序扩展映射”对话框中设置的文件夹才会过滤出要由 aspnet_isapi.dll 处理的 PDF 文件。为了证明这一点,右键单击 Internet 服务管理器中的默认网站。执行第 29 步和第 30 步。列表中没有 PDF,这意味着只有您指定的文件夹中的文件才会被发送到 aspnet_isapi.dll。我不认为这会在共享托管环境中造成性能问题,除非您的宝贵数字财产获得数百万次点击。如果是这样,您就可以负担得起独立服务器了。总之,我的新 ISP 在不到一小时的时间内就实现了这个服务器端调整。我相信给他们提供这个分步页面肯定有帮助。您永远不会在 ISP 的技术支持团队中交太多朋友。

© . All rights reserved.