zoukankan      html  css  js  c++  java
  • IIS6 处理程序为什么在IIS7中不能正确运行

    最近在做一个数据导出的功能

    1.在页面中加入一个IFRAME

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="xxx_Default"
    Title
    ="xxx" %>
    .
        
    <iframe id='frmDownload' name="frmDownload" frameborder="0" style='display: none;' src=''></iframe>
    .

    2.再添加一个导出功能按钮(随便什么按钮,只要能调用脚本就可以了


        
    <a href="javascript:ExportData2Excel();" id="aExportData2Excel">
                                导出数据
        
    </a>

    3.在Web.config中映射处理导出的程序,该类要继承IHttpHandler接口

    IIS6注册方法:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>

        
    <system.web>

            
    <!--  请求映射处理  -->
            
    <globalization requestEncoding="utf-8"
                           responseEncoding
    ="utf-8" />
            
    <httpHandlers>

                
    <!--  下载附件映射处理  -->
                
    <add verb="GET"
                     path
    ="Handler/ExportData.aspx"
                     type
    ="[namespace].ExportDataHandler, [dll名称]"/>

            
    </httpHandlers>

        
    </system.web>

    </configuration>



    说明:这个是在IIS6中注册Handler的方法, "Handler/ExportData.aspx" 是你映射的Http处理程序的虚拟路径,不是真实存在的. ExportDataHandler   是你的Http处理程序的类名,[dll名称]:我的Http处理程序是单独放在别一个项目中的,所以要加上引用的dll的名称,如果是放在App_Code文件中,则不用加dll名称.

    4.现在,添加一个继续IHttpHandle

    using System.Web;
    public class ExportDataHandler : IHttpHandler
    {
        
    public ExportDataHandler ()
        
    {
            
    //
        }

        
    public void ProcessRequest(HttpContext context)
        
    {
            
    //导出处理代码,太长不写了
            
    //Http请求响应代码
            context.Response.Clear();
            context.Response.ContentEncoding 
    = Encoding.GetEncoding("GB2312");
            context.Response.Charset 
    = "GB2312";
            context.Response.HeaderEncoding 
    = Encoding.GetEncoding("GB2312");
            context.Response.AddHeader(
    "Accept-Ranges""bytes");
            context.Response.AddHeader(
    "Content-Length", objFileInfo.Length.ToString());
            context.Response.AddHeader(
    "ContentType""Application/ms-download");
            context.Response.AddHeader(
    "Content-Disposition"string.Format("Attachment; FileName={0}.{1}", fileName, exportFileType));//fileName导出数据生成的文件名,exportfileType:导出文件的类型如:xls
            context.Response.TransmitFile(objFileInfo.FullName);
            context.Response.Flush();
        }

        
    public bool IsReusable
        
    {
            
    //是否缓存对象
            
    //如果返回false则每次请求时都生成一个新的Hanlder实例
            get return true; }
        }

    }


    这个比较简单,只是一个简单的处理类.

    5.我是用脚本触发的,顺便把脚本也写出来

    //导出数据
    function ExportData2Excel()
    {
        
    //调用Handler
        var searchCondition = document.getElementById("txtSearchCondition");//搜索条件文件框
        var url = "Handler/GetExportCustomreMobileFile.aspx?ExportType=1&SearchCondition=" + searchCondition;//Web.config中注册的Http处理程序的虚拟地址,后面可跟参数,
        var frmDownload = document.getElementById("frmDownload");//IFRAME
       frmDownload.src = url; 
    }

    在IIS6中这个程序运行很正常,但是在IIS7中,这样做就要做些特殊处理才能通过了.

    在IIS7中,Handler没有被调用,查阅了下MSDN,找到解决方法.

    MSDN原文:《将 ASP.NET 应用程序从 IIS 6.0 迁移到 IIS 7.0

    =======================

    本主题介绍如何将 Web 应用程序从 Internet 信息服务 (IIS) 6.0 迁移到 IIS 7.0。可以将 IIS 7.0 中的 Web 应用程序配置为使用经典模式或集成模式。经典模式使用 ISAPI 扩展来调用 ASP.NET 运行库,以此保持对 IIS 早期版本的向后兼容性。此选项通常只需对现有应用程序进行少量修改,甚至完全不需要修改。

    IIS 7.0 集成模式是一种统一的请求处理管道,它将 ASP.NET 请求管道与 IIS 核心请求管道组合在一起。集成管道提供更好的性能,实现配置和管理的模块化,且增加了使用托管代码模块扩展 IIS 时的灵活性。例如,您可以在 Web 应用程序的 App_Code 文件夹中定义一个托管代码模块,然后注册该模块,将其应用于所有 IIS 请求(包括对静态文件的请求)。

    使用 IIS 7.0 集成模式可能需要对应用程序的 Web.config 文件进行少量更改。如果应用程序使用了任何实现 IHttpModule 接口的自定义模块,那么可能需要进行其他一些更改。...

    =======================


    解决方案一、
    把IIS6的应用程序发布到IIS7的时候,运行在经典模式下。在添加应用程序时,选择应用程序池“Class .Net AppPool”;

    解决方案二、
    Web.config要做一些修改,这个方案没有具体实验过。有空实验下

    a.据MSDN说是只要改变下注册的方法并运行在“DefaultAppPool”(即集成模式)下

    MSDN原文:《演练:创建同步 HTTP 处理程序
    =============================
    <configuration>
      <system.webServer>
        <handlers>
          <add verb="*" path="*.sample"
            name="HelloWorldHandler"
            type="HelloWorldHandler"/>
        </handlers>
      </system.webServer>
    </configuration>
    =============================

    b.在经典模式下

    MSDN原文:
    =============================
    <configuration>
      <system.web>
        <httpHandlers>
          <add verb="*" path="*.sample"
            type="HelloWorldHandler"/>
        </httpHandlers>
      </system.web>
        <system.webServer>
            <handlers>
                <add  verb="*" path="*.sample"
                      name="HelloWorldHandler"
                      type="HelloWorldHandler"
                      modules="IsapiModule"/>
                      scriptProcessor="%path%"aspnet_isapi.dll"
            </handlers>
        </system.webServer>
    </configuration>
    =============================

  • 相关阅读:
    【bzoj1408】 Noi2002—Robot
    【bzoj3884】 上帝与集合的正确用法
    【bzoj2190】 SDOI2008—仪仗队
    【uoj264】 NOIP2016—蚯蚓
    【uoj262】 NOIP2016—换教室
    【uoj261】 NOIP2016—天天爱跑步
    python sort 和sorted排序
    mkdir: cannot create directory ‘/soft/hadoop-2.7.3/logs’: Permission denied问题
    RuntimeError: implement_array_function method already has a docstring
    flask 的orm
  • 原文地址:https://www.cnblogs.com/boywujch/p/1245237.html
Copyright © 2011-2022 走看看