zoukankan      html  css  js  c++  java
  • 小心使用IHttpHandler下的IsReusable属性

    简单介绍

    我们平时在开发的时候,常常做一些自己定义的HttpHandler。每次再继承IHttpHandler接口的时候,都要设置IsReusable的值,通常我们都是设置返回true,但是我们要小心这个返回值。由于设置为true的时候有非常多前提条件,当中最重要的2个是:

    1. 线程要安全
    2. 一个请求的HttpHandler实例下的状态或上下文信息不能被另外一个请求共享。

    再深一点

    MSDN对IsReusable的解释很少:获取一个值。该值指示其它请求能否够使用 IHttpHandler 实例。

    首先,IsReusable这个属性其有用来指明IHttpHandler实现类的实例能否够被用来处理多个请求。当通过ASP.NET 管道处理时,每一个client请求被服务端觉得是一个工作者线程。因此,假设我们设置 IsReusable = true 时,我们须要确信ProcessRequest 方法是线程安全的。 ProcessRequest 应该不会依赖不论什么有可能被其它请求改动的状态值。

    当你的IHttpHandler实现类忙于做初始化时,否则你无需介意IsReusable 返回的是true 或者 false。

     

    另外,由于HttpHandler实例是由HttpHandlerFactory来创建的,而HttpHandlerFactory创建HttpHandler实例的时候会将上下文信息HttpContext作为參数传进去,假设多个工作者线程共享这个实例的话,那就不能都依赖HttpContext.Request内容,由于依赖了。那各个请求就乱了,比方你通过一个Request參数设置Httphandler的一个属性值,然后其它线程在调用的时候就有可能用到这个值。(可是能够利用Request參数去分别处理自己的逻辑,仅仅要不共享即可),再比方我们假设在做多用户信息的时候。假设一个用户能管理另外一个用户的资源的话。那就有问题了。

     

    微软之所以暴露这个属性给我们,由于创建HttpHandler的开销比較大,当IsReusable 为真时。 CLR会维护一个对象池,进去重用,但同一时候它也应该是无状态的。

    总结

    所以说在设置IsReusable为true的时候,一定要保证线程安全。而且不依赖Request项,当然也不应该有成员变量,由于成员变量在同一个实例下是任意可用的。

    另外另一点是。尽量不要使用.ashx文件格式,由于它是在第一期请求的时候才编译,速度自然没有预先编译快了。所以建议在web.config里直接指定所相应的HttpHandler。

  • 相关阅读:
    LeetCode-102-二叉树的层序遍历
    LeetCode-086-分隔链表
    LeetCode-082-删除排序链表中的重复元素 II
    LeetCode-081-搜索旋转排序数组 II
    [leetcode]92. Reverse Linked List II反转链表2
    [leetcode]94. Binary Tree Inorder Traversal二叉树中序遍历
    [leetcode]100. Same Tree相同的树
    [leetcode]54. Spiral Matrix螺旋矩阵
    [leetcode]58. Length of Last Word最后一个词的长度
    [leetcode]41. First Missing Positive第一个未出现的正数
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6874563.html
Copyright © 2011-2022 走看看