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






2.83/5 (4投票s)
2005年7月12日
5分钟阅读

47908

339
在特定文件夹中通过登录保护任何文件类型。
引言
我的 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。
更多
- ASP.NET 中的 HTTP 处理程序和 HTTP 模块.
- 在 ASP.NET 中实现 HTTP 处理程序.
- 使用 ASP.NET HTTP 处理程序创建照片集.
- 使用自定义 HTTP 处理程序提高 ASP.NET 的性能.
Install
- 解压 AppMapFileTest.zip。
- 在 IIS 中创建一个虚拟文件夹,指向物理目录(AppFileMapTest.csproj 所在的位置)。
- 将 MyHandler.dll 从 MyHandler 的 obj/Debug 目录复制到 AppMapFileTest 的 bin 目录。
- 执行第 24 至 43 步。
- 在 Visual Studio 中打开 AppMapFileTest.csproj,编译并运行。
从零开始构建
打开 VS.NET:选择“新建项目”。语言:C#。类型:Web 应用程序。名称:AppMapFileTest。
- 解决方案资源管理器 - 右键单击 AppMapFileTest - 添加 Web 窗体 - 名称:index.aspx。
- 从工具箱拖放一个
Label
。属性 -Text
:Welcome
。 - 解决方案资源管理器 - 右键单击 AppMapFileTest - 添加 Web 窗体 - 名称:Login.aspx。
- 从工具箱拖放一个
Label
。属性 -Text
:UserID
。 - 从工具箱拖放另一个
Label
。属性 -Text
:Password
。 - 从工具箱拖放一个
TextBox
。属性 -Text
:txtUserId
。 - 从工具箱拖放一个
TextBox
。属性 -Text
:txtPassword
。 - 从工具箱拖放一个
Button
。属性 -Text
:Login
,Name
:cmdLogin
。 - 解决方案资源管理器 - 右键单击 index.aspx - 设置为启动页。
- 通过运行应用程序进行测试。您应该会看到一个显示“Welcome”的浏览器窗口。
- 打开 Windows 资源管理器,在该项目内添加一个名为 scores 的文件夹。
- 在 index 页面上,单击页面左下角的 HTML。
<body MS_POSITIONING="GridLayout">
标签后的那一行创建了两个超链接<a href="example.pdf"target=_blank>Example Page</a>
<a href="scores/buynow.pdf"target=_blank>Buy Now</a>
- 打开 Windows 资源管理器,将 example.pdf 放在应用程序的根目录中,将 buynow.pdf 放在一个名为 scores 的新文件夹中。我从这里获取了下一个项目的大部分内容。
- 启动 VS.NET 的新实例。
- VS.NET:新建项目。语言:C#。类型:类库。名称:MyHandler。
- 创建一个派生自
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 } }
- 编译此代码,并将 MyHandler.dll 从 bin/Debug 文件夹复制到 AppMapFileTest 应用程序的 bin 文件夹。
- 运行 AppMapFileTest 应用程序。这两个链接应该在单独的页面中打开,无需登录。
- 打开 web.config。
- 将行:
<authentication mode="Windows" />
修改为<authentication mode="Forms" > <forms name=".reelbook" loginUrl="Login.aspx"/> </authentication>
- 在
<system.web>
之后,</system.web>
标签之前,添加<httpHandlers> <add verb="GET" path="scores/*.pdf" type="MyHandler.NewHandler,MyHandler"/> </httpHandlers>
- 在
</system.web>
标签之后,</configuration>
标签之前,添加<location path="scores"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location>
- 测试应用程序。它仍然不需要登录。
- 打开“控制面板/管理工具/Internet 信息服务”。
- 展开(本地计算机)。
- 展开“网站”。
- 展开“默认网站”。
- 右键单击 AppFileMapTest。
- 选择“属性”。
- 在“目录”选项卡中,单击“配置”按钮。
- 在“应用程序配置”对话框中,单击“添加”按钮。
- 在“添加/编辑应用程序扩展映射”对话框中,单击“浏览”。
- 在“打开”对话框中,选择文件类型为 .dll,然后导航到 C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 文件夹。
- 双击 aspnet_isapi.dll。
- 在“添加/编辑应用程序扩展映射”对话框中,在“扩展名”文本框中输入 .pdf(不要忘记点)。
- 在“Verbs”下,我只需要 GET,所以单击“限制为”单选按钮,并在文本框中输入 GET。
- 取消选中“检查文件是否存在”复选框。
- 点击“确定”。
嘿!“确定”按钮是灰色的!经过漫长的 Google 搜索,我发现了这个。
- 单击文本框本身,路径将完全展开,启用“OK”按钮,这样您就可以保存映射。
- 单击“应用”。
- 点击“确定”。
- 单击“应用”。
- 点击“确定”。
- 测试应用程序。
- 单击“Example Page”链接 - 它像以前一样工作。
- 单击“Buy Now”链接 - 它跳转到 Login.aspx 页面。
- 单击“Login”按钮 - 无反应。
- 在 Visual Studio 中,转到 Login.aspx 的设计视图,然后双击 Login 按钮。
- 在
cmdLogin_Click
方法中,添加一行代码FormsAuthentication.RedirectFromLoginPage(txtUserId.Text, false);
运行它。它不支持
FormsAuthentication
。 - 添加一个
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 的技术支持团队中交太多朋友。