深远明白asp,管理特定项指标web页面

复制代码 代码如下:

1经你早已修改了ASP.NET应用程序(dll文件),与修改了bin文件夹或Web.config文件(增多/删除/重命名的文件等),而该网址在运维,你恐怕曾经注意到,那将促成在AppDomain的再次启航。全体的对话状态会丢掉和网址再次成功运行,任何登陆的用户将被剥离(若是你不采用长久库克ie身份验证)。
当然,当我们修改了web.config文件,并保存它,迫使三个AppDomain重新起动,那是大家须要的。

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

经不住了,继续贴。
1 、概述
997755.com澳门葡京 1
评释:HttpHandler是多个HTTP请求的真正管理中央。在HttpHandler容器中,ASP.NET
Framework才调用HttpHandler的ProcessRequest成员方法来对那些HTTP请求实行真正的拍卖,真正地对客户端请求的服务器页面做出编写翻译和实施,并将拍卖以往的音信附加在HTTP请求音讯流中再次再次回到到HttpModule中。
2、举例
以三个aspx页面为例,正是在HttpHandler这里,一个aspx页面才被系统管理解析,并将拍卖完结的结果再而三经由HttpModule传递下去,直至到达客户端。当然,对于aspx页面,ASP.NET
Framework在暗中认可景况下是付诸System.Web.UI.PageHandlerFactory这一个HttpHandlerFactory来管理的。当三个HTTP请求到达这一个HttpHandlerFactory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由那么些HttpHandler容器来管理那个HTTP请求。
一个HTTP请求都以最终提交2个HttpHandler容器中的ProcessRequest方法来管理的。
3、HttpHandler
(一)达成HttpHandler,必须继续自IHttpHandler接口。下边是那些接口的概念:

using System;
using System.Web;
using System.Web.SessionState;

作者们一时动态成立和删除的公文夹,在ASP.NET
2.0中,文件夹删除将导致2个AppDomain重新起动,那将招致惨重的难点。
比方,对于多个电子商务网址的成品,你或然想囤积在目录中的产品来自它的名字ID的产品的图形,比方。/
productImages/123/ipod-nano.jpg,以致为身份证图像的笔录。
那有助于制止与其他上载的文本和图像文件名争持。
当然,当您来到删除从数据库产品,你当然要去除其相应的图像和蕴含它的文书夹,但明显无法因为那AppDomain重新启航的难点。
因为,大家删除留在我们的服务器中的空文件夹(文件删除不会挑起应用程序重新起动)。

HttpModule是过滤器,HttpHandler达成了ISAPI扩充功用,他管理请求(Request)的消息和发送响应(Response)。HttpHandler效率通超过实际行IHttpHandler接口达到。

997755.com澳门葡京 2997755.com澳门葡京 3Code
using System;

public class HandleDataRequst : IHttpHandler, IRequiresSessionState
{

解决方案

HttpHandler管理程序落成了System.Web.IHttpHandler接口的.NET组件。任何事项了IHttpHandler接口的类都得以用来拍卖输入的HTTP请求,那就像于ISAPI扩大。HTTPHandler与ISAPI扩大的分化在于在U奇骏L中得以应用HttpHandler的文件名称直接调用,那与ISAPI扩张类似。

namespace System.Web
{
    // Summary:
    //     Defines the contract that ASP.NET implements to synchronously process HTTP
    //     Web requests using custom HTTP handlers.
    public interface IHttpHandler
    {
        // Summary:
        //     Gets a value indicating whether another request can use the System.Web.IHttpHandler
        //     instance.
        //
        // Returns:
        //     true if the System.Web.IHttpHandler instance is reusable; otherwise, false.
        //  别的Request是不是可以动用IHttpHandler
        bool IsReusable { get; }

public void ProcessRequest (HttpContext context) {
//context.Session[“name”]
}

有幸的是,大家有了Reflection and HttpModules的缓和方案。
首先创制1个像.cs文件…

兑现的步骤:

        // Summary:
        //     Enables processing of HTTP Web requests by a custom HttpHandler that implements
        //     the System.Web.IHttpHandler interface.
        //
        // Parameters:
        //   context:
        //     An System.Web.HttpContext object that provides references to the intrinsic
        //     server objects (for example, Request, Response, Session, and Server) used
        //     to service HTTP requests.
        //  处理HttpRequest
        void ProcessRequest(HttpContext context);
    }
}

此间的入眼是一定要促成IRequiresSessionState可能IReadOnlySessionState,不然Session总是为null

复制代码 代码如下:

一、 编写类达成IHttphandler接口,并编写翻译为dll

(2)自定义HttpHandler
a、代码
新建叁个网址,default.aspx页面:
default.aspx.cs:

当然那八个接口中从不明确任何方法。

using System.Reflection;
using System.Web;
namespace MyWebsite
{
/// <summary>
/// Stops the ASP.NET AppDomain being restarted (which clears
/// Session state, Cache etc.) whenever a folder is deleted.
/// </summary>
public class StopAppDomainRestartOnFolderDeleteModule : IHttpModule
{
public void Init(HttpApplication context)
{
PropertyInfo p = typeof(HttpRuntime).GetProperty(“FileChangesMonitor”,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
object o = p.GetValue(null, null);
FieldInfo f = o.GetType().GetField(“_dirMonSubdirs”,
BindingFlags.Instance | BindingFlags.NonPublic |
BindingFlags.IgnoreCase);
object monitor = f.GetValue(o);
MethodInfo m = monitor.GetType().GetMethod(“StopMonitoring”,
BindingFlags.Instance | BindingFlags.NonPublic);
m.Invoke(monitor, new object[] { });
}
public void Dispose() { }
}
}

二、 在web.config恐怕machine.config文件中登记那些管理程序。

997755.com澳门葡京 4997755.com澳门葡京 5Code
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

你也许感兴趣的文章:

  • ASP.NET将Session保存到数据库中的方法
  • asp.net
    session的选取与过期实例代码
  • 三种推断asp.net中session过期方法的比较
  • asp.net中session的规律及采用详解
  • ASP.NET通过布满式Session提高品质
  • ASP.NET中在一般管理程序中央银行使session的简练介绍

假若你喜欢在
Application_Start使用Global.asax文件中,放置在Init()代码在Application_Start
中。
小编深信在Global.asax使用方法已不合时宜,在运用HttpModules能够响应互连网(应用程序生命周期的对话早先,会话甘休时,)。
init方法在Global.asax同Application_Start成效是1致的,Dipose类似于Application_End。

997755.com澳门葡京,3、 在IIS中把文件扩充(你要处理的文书的扩张名)映射到ASP.NET
ISAPI扩展(aspnet_isapi.dll)上面。

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(“<br/>来自Default.aspx页面<br/>”);
    }
}

大家要以上述代码起效果,需求在web.config文件<httpModules>区段中放入:

四、创设三个*深远明白asp,管理特定项指标web页面。.xumh的文本,你会发掘能够被管理了

新增加一个类库MyHandler,增多1个类如下:

<add name=”stopAppDomainRestartOnFolderDelete”
type=”MyWebsite.StopAppDomainRestartOnFolderDeleteModule” />
亟需证实的是,”stopAppDomainRestartOnFolderDelete”为自定义的任性名称,”MyWebsite”为上述.cs文件中的命名空间,一般为品种名称.”StopAppDomainRestartOnFolderDeleteModule”为上述.cs文件中的类名.

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

997755.com澳门葡京 6997755.com澳门葡京 7Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.SessionState;

那正是它。
这将防备文件夹删除AppDomain重新开动,但修改web.config和bin文件夹时仍会再也起动,那多亏大家想要的。

namespace xumh
{
    /// <summary>
    /// HttpHandler完结IHttpHandler接口,能够定义对特定类型的文本的拍卖
    /// 一、编写类完结IHttpHandler接口,并编写翻译为dll文件
    /// 贰、在web.config文件中登记
    /// <httpHandlers>
    ///        <add verb=”*” path=”*.xumh” type=”xumh.testHttpHandler,testHttpHandler”/>
    ///        <add verb=”动作:Post/Get” path=”管理的文件类型” type=”空间.类名,dll名称”/>
    /// </httpHandlers>
    /// </summary>
    public class testHttpHandler : IHttpHandler , System.Web.SessionState.IRequiresSessionState
    {
        /// <summary>
        /// HttpHandler是还是不是足以用来拍卖一样的别样类型的呼吁,达成重用
        /// </summary>
        public bool IsReusable
        {
            get { return true; }
        }

namespace MyHandler
{
    /// <summary>
    /// 假诺要在HttpHandler容器中接纳Session,必需要兑现IRequiresSessionState接口
    /// </summary>
    public class MyTestHandler : IHttpHandler, IRequiresSessionState
    {

不过多删除多少个公文就能够意识session仍旧会晚点,为啥会是这样的吗?今后还没搞清楚…于是在网络搜寻就有了下边包车型大巴这种艺术

        /// <summary>
        /// HttpHandler管理程序的为主,调用这么些措施来拍卖Http请求
        /// </summary>
        /// <param name=”context”></param>
        public void ProcessRequest(HttpContext context)
        {
            string html = @”<html>
                                    <body>
                                        <h1>Hello xumh Reader</h1>
                                    </body>
                                </html>”;
            //要拍卖session,必须引进System.Web.SessionState.IRequiresSessionState
            System.Web.SessionState.HttpSessionState session = context.Session;
            session[“One”] = “Session One!”;
            //
            context.Session[“Another”] = “Another Session”;
            context.Response.Write(“Session: Another 的值为 ” + context.Session[“Another”].ToString());

        public bool IsReusable
        {
            get { return true; }
        }

在 <system.web>下面配置session的保存方法为stateserver就足以了

            context.Response.Write(html);
        }
    }
}

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write(“<h3><b>This is a HttpHandler Test</b></h3>”);

<sessionState mode=”StateServer” stateNetworkTimeout=”20″
stateConnectionString=”tcpip=127.0.0.1:42424″ />
参数1看就知晓是怎么着看头了..

            context.Session[“Test”] = “<h3><span style=\”color:blue;\”>在HttpHandler容器中调用Session</span></h三>”;

您或者感兴趣的小说:

  • asp.net(C#)清除全部Session与单个Session的主意
  • C#先后中session值的保存方法以及转为字符串的措施计算
  • C#先后中session的骨干设置示例及清除session的格局
  • ASP.NET在后面部分类库中获得Session
    C#类中赢得Session
  • C#兑现轻松取得及安装Session类
  • C#操作session的类实例
  • asp.net(c#)有关 Session
    操作的多少个误区
  • IIS服务器中 ASP.NET State Service 开启后 Session
    仍轻巧丢失的标题终极解决办法
  • ASP.NET在IE第10中学不能判断用户已登录及Session丢失难点化解格局
  • C#
    SESSION丢失难题的化解办法

            context.Response.Write(context.Session[“Test”]);
        }

    }
}

要在HttpHandler使用Session,小编在旧文aspx,ascx和ashx使用小结里早就聊起。
b、配置文件
在web.config文件的system.web节点下,添加:
      <httpHandlers>        
        <add verb=”*” path=”*” type=”MyHandler.MyTestHandler,
MyHandler”/>
      </httpHandlers>
c、注意
<一>、.NET为asp.net提供了重重体系暗中同意HttpHandler类,用来适应差别品类的HttpRequest。比如aspx,在machine.config中是如此定义的:   
        <add verb=”*” path=”*.aspx”
type=”System.Web.UI.PageHandlerFactory”/>
那就印证遇到aspx的Request请求,asp.net会将其交付System.Web.UI.PageHandlerFactory的HttpHandler类来拍卖。
<二>、假若和谐定义了新的HttpHandler,而且在web.config中钦定,则系统只会使用这些新的HttpHandler,而不再选择原来私下认可的或许内定的.

<3>、直接拷贝类库的bin目录下的公文到网址bin下.
4、HttpHandlerFactory
ASP.NET
Framework实际不直接将相关的页面财富HTTP请求定位到三个其里面私下认可的IHttpHandler容器之上,而一定到了其内部暗中同意的IHttpHandler工厂上。IHttpHandler工厂的法力是对IHttpHandler容器实行调节和治本,那样做的亮点是大大坚实了系统的负荷性,提高了效用。
(1)IHttpHandlerFactory接口
 IHttpHandlerFactory接口蕴涵多少个措施:GetHandler方法再次来到落成IHttpHandler接口的类的实例,ReleaseHandler方法使工厂能够引用现成的管理程序实例。

997755.com澳门葡京 8997755.com澳门葡京 9Code
using System;
using System.Web;

namespace System.Web.UI
{
    // Summary:
    //     Creates instances of classes that inherit from the System.Web.UI.Page class
    //     and implement the System.Web.IHttpHandler interface. Instances are created
    //     dynamically to handle requests for ASP.NET files. The System.Web.UI.PageHandlerFactory
    //     class is the default handler factory implementation for ASP.NET pages.  
    public class PageHandlerFactory : System.Web.IHttpHandlerFactory2, IHttpHandlerFactory
    {
        // Summary:
        //     Initializes a new instance of the System.Web.UI.PageHandlerFactory class.
        protected internal PageHandlerFactory();

        // Summary:
        //     Returns an instance of the System.Web.IHttpHandler interface to process the
        //     requested resource.
        //
        // Parameters:
        //   context:
        //     An instance of the System.Web.HttpContext class that provides references
        //     to intrinsic server objects (for example, Request, Response, Session, and
        //     Server) used to service HTTP requests.
        //
        //   requestType:
        //     The HTTP data transfer method (GET or POST) that the client uses.
        //
        //   virtualPath:
        //     The virtual path to the requested resource.
        //
        //   path:
        //     The System.Web.HttpRequest.PhysicalApplicationPath property to the requested
        //     resource.
        //
        // Returns:
        //     A new System.Web.IHttpHandler that processes the request; otherwise, null.
        public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path);
        //
        // Summary:
        //     Enables a factory to reuse an existing instance of a handler.
        //
        // Parameters:
        //   handler:
        //     The System.Web.IHttpHandler to reuse.
        public virtual void ReleaseHandler(IHttpHandler handler);
    }
}

(二) 完毕多个简便的HttpHandler工厂
类库新扩展一个文书MyHandlerFactor.cs:

997755.com澳门葡京 10997755.com澳门葡京 11Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;

namespace MyHandler
{
    public class MyHandlerFactory : IHttpHandlerFactory
    {

        public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
        {
            string fileName = url.Substring(url.LastIndexOf(‘/’) + 1);
            string objName = fileName.Substring(0, fileName.IndexOf(‘.’));
            string className = “MyHandler.” + objName;

            object objHandler = null;

            try
            {
                // 选取动态反射机制创造相应的IHttpHandler完成类。
                objHandler = Activator.CreateInstance(Type.GetType(className));
                context.Response.Write(className);
                //context.Response.Redirect(“default.aspx”);
            }
            catch (Exception e)
            {
                throw new HttpException(“工厂不能够为品种” + objName + “成立实例。”, e);
            }

            return (IHttpHandler)objHandler;
        }

        public void ReleaseHandler(IHttpHandler handler)
        {

        }

    }

    public class Handler1 : IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {

            context.Response.Write(“<br/>那是来自于MyHandlerFactory里的管理.<br/>”);
            context.Response.Write(“<h3>来自Handler1的信息.</h3>”);
        }

    }

    public class Handler2 : IHttpHandler
    {

        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Write(“<br/>那是发源于MyHandlerFactory里的管理.<br/>”);
            context.Response.Write(“<h3>来自Handler2的信息.</h3>”);
        }

    }
}

网址新增多个文本,Handler1.aspx和Handler贰.aspx。它们的cs文件:

997755.com澳门葡京 12997755.com澳门葡京 13Code
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Handler1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
           Response.Write(“那是根源于MyHandler页面直接输出…”); //这一句不起成效了,MyHandlerFactory已经对该页面包车型大巴HttpContext实行了管理
    }
}

跟器重新修改配置文件:
      <httpHandlers> 
           <add verb=”*” path=”Handler1.aspx”
type=”MyHandler.MyHandlerFactory, MyHandler”/>
           <add verb=”*” path=”Handler2.aspx”
type=”MyHandler.MyHandlerFactory, MyHandler”/>
      </httpHandlers>
到此地,针对Handler一.aspx和Handler2.aspx八个页面包车型大巴http请求大家就由此HttpHandler工厂管理好了。
5、HttpHandler和HttpModule的区别
器重有两点:
 (1)先后次序.先IHttpModule,后IHttpHandler,IHttpHandler管理终结后再交由IHttpModule;
 (二)对请求的拍卖上:
       
IHttpModule是属于大小通吃类型,无论客户端请求的是何等文件,都会调用到它;比如aspx,html,rar的央求;
       
IHttpHandler则属于挑食类型,唯有asp.net注册过的文件类型(比如aspx,ascx,asmx等等)才会轮到调用它。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website