Http Handler正在iis express工作,而不是在iis服务器上工作

时间:2013-02-06 12:24:57

标签: asp.net iis-7 httphandler

我将实现HttpHandler,以便允许基于会话值从我的站点下载文件。如果会话存在,则允许用户下载文件,否则重定向到索引页面,该页面是站点的登录页面。当我在iis服务器上运行我的网站时,我的代码在iis express中工作正常,处理程序无法运行。

对于IIS express,web.config文件包含我已添加的以下部分。以下配置适用于iis express。

<system.web>

<httpHandlers>

  <add verb="*" path="*.pdf" type="QDMS.FileHandler" />
Same add tag for all the files to restrict downloading without session.

</httpHandlers>

</system.web>

以下是无效的IIS服务器配置。

<system.webServer>

<handlers>
  <add name="Files" path="*.pdf,*.doc,*.docx,*.rar,*.zip,*.ppt,*.pptx,*.jpg,*.png,*.bmp,*.gif,*.html,*.htm,*.pps" verb="*" type="QDMS.FileHandler" resourceType="Unspecified" requireAccess="script" />    
</handlers>

</system.webServer>

我的文件处理程序位于

之下
using System;
using System.Web;
using System.Web.SessionState;
using QDMS.Old_App_Code;

namespace QDMS
{
public class FileHandler : IHttpHandler, IReadOnlySessionState
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
if (!CheckWetherTheRequestForFileExistOrNot(context)) return;
if (CheckUsersForFileDownloading(context))
context.Response.Redirect("~/index.aspx");
else
{
var rawURL = context.Request.RawUrl;
var dotIndex = rawURL.LastIndexOf(".", System.StringComparison.Ordinal);
var ext = rawURL.Substring(dotIndex);
context.Response.ClearContent();
context.Response.ClearHeaders();
context.Response.ContentType = MIMEEType.Get(ext);
context.Response.AddHeader("Content-Disposition", "attachment");
context.Response.WriteFile(rawURL);
context.Response.Flush();
}  
}
public bool CheckWetherTheRequestForFileExistOrNot(HttpContext context)
{
string url = context.Request.RawUrl.ToLower().Trim();
if (url.Contains(".pdf") || url.Contains(".xls") || url.Contains(".xlsx") || url.Contains(".jpg") ||
            url.Contains(".bmp") || url.Contains(".rar") || url.Contains(".doc") || url.Contains(".docx") ||
            url.Contains(".png") || url.Contains(".gif") || url.Contains(".pptx") || url.Contains(".zip") ||
            url.Contains(".ppt") || url.Contains(".pps") || url.Contains(".htm") || url.Contains(".html"))
return true;
else
return false;
}
public bool CheckUsersForFileDownloading(HttpContext context)
{
return (context.Session["FrontHiddenID"] == null) && (context.Session["HiddenID"] == null);
}
}
}

我确信web.config文件中的部分不正确,这就是它无法正常工作的原因。所以我需要建议来纠正web.config文件中的处理程序部分。 任何有关此问题的建议和帮助都将受到高度赞赏

2 个答案:

答案 0 :(得分:3)

你的IIS处理程序应该是这样的:

<add name="Files" path="*.pdf" verb="*" type="QDMS.FileHandler" resourceType="Unspecified" requireAccess="Script" />

与您的版本有两点不同:

  • 只有一个文件掩码,您应该为每种文件类型注册一个处理程序
  • requireAccess="Script",“脚本”的大写字母为'S'

希望这会有所帮助

答案 1 :(得分:3)

在经典模式下运行的IIS 7.0中映射文件扩展名

  1. 打开IIS管理器。
  2. 展开Web服务器计算机的节点,展开“站点”,然后展开“默认网站”。
  3. 选择应用程序的节点。 将显示“功能视图”窗格。
  4. 在“功能视图”中,双击“处理程序映射”。
  5. 在“操作”窗格上,单击“添加脚本映射”。 将显示“添加脚本映射”对话框。
  6. 在“添加脚本映射”对话框中,指定以下内容: o请求路径。要映射的名称或文件扩展名。 o可执行文件。将处理请求的.exe或.dll文件的路径。对于经典模式,请指定ASP.NET ISAPI扩展(Aspnet_isapi.dll)。 o名字。描述性名称。
  7. 单击“确定”关闭“添加脚本映射”对话框。
  8. 打开应用程序的Web.config文件。
  9. 找到system.web部分的httpHandlers元素,并为文件扩展名添加一个条目。
  10. 在以集成模式运行的IIS 7.0中映射文件扩展名

    1. 按照上一步骤的步骤1至3进行操作。
    2. 在“操作”窗格上,单击“添加托管处理程序”。 将显示“添加托管处理程序”对话框。
    3. 在“添加托管处理程序”对话框中,指定以下内容: o请求路径。要映射的文件名或文件扩展名。 o键入。托管处理程序的类型(类)名称。如果处理程序在ASP.NET应用程序的App_Code文件夹中定义,则其类型名称将显示在下拉列表中。 o名字。描述性名称。
    4. 单击“确定”关闭“添加托管处理程序”对话框。