ArcGIS Add Dynamic Data
ArcGIS_AddDynamicData_CSharp\App_Code\CustomMapHandler.cs
// Copyright 2009 ESRI
// 
// All rights reserved under the copyright laws of the United States
// and applicable international laws, treaties, and conventions.
// 
// You may freely redistribute and use this sample code, with or
// without modification, provided you include the original copyright
// notice and use restrictions.
// 
// See the use restrictions.
// 

namespace MyHandler
{
    public class CustomMapHandler : ESRI.ArcGIS.ADF.Web.UI.WebControls.MapHandler
    {
        ServerObjectStateModifier m_serverObjectStateModifier = null;

        // Extend the MapHandler's constuctor to instanstiate a ServerObjectStateModifier to use for adding and
        // removing the dynamic layer
        public CustomMapHandler()
            : base()
        {
            m_serverObjectStateModifier = new ServerObjectStateModifier();            
        }

        // Override OnResourceInit to make adding the dynamic layer part of resource item initialization if the
        // dynamic layer is currently added
        protected override void OnResourceInit(ESRI.ArcGIS.ADF.Web.UI.WebControls.MapResourceItem mapResourceItem)
        {
            base.OnResourceInit(mapResourceItem);

            // Check whether the dynamic layer is currently added and the current resource item being initialized is
            // the target resource item for layer addition
            if ((System.Web.HttpContext.Current.Session["dynamicLayerAdded"] != null)
            && ((bool)System.Web.HttpContext.Current.Session["dynamicLayerAdded"])
            && (mapResourceItem.Name == (string)System.Web.HttpContext.Current.Session["targetResourceName"]))
            {
                // Add the dynamic layer to the map service.  Note that we have to do this every time our custom MapHandler
                // goes through its life cycle (which will happen on any map draw operations) to make the MapHandler aware
                // of the dynamic layer's presence.  The dynamic layer is not being persisted in the map service because
                // it is being explictly removed before any server context containing it is released (via 
                // MapResourceManager.ResourcesDispose in the page and OnResourcesDispose - below - in the map handler).
                // The layer is explictly removed before server context is released because it would otherwise be visible
                // to other clients, which is what we want to avoid.
                m_serverObjectStateModifier.AddLayer(mapResourceItem.Resource as 
                    ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal,
                    (string)System.Web.HttpContext.Current.Session["dynamicLayerName"]);
            }

            if ((System.Web.HttpContext.Current.Session["RendererChanged"] != null)
            && (bool)System.Web.HttpContext.Current.Session["RendererChanged"])
            {
                m_serverObjectStateModifier.ApplySimpleRenderers(mapResourceItem.Resource as
                    ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal,
                    ServerObjectStateModifier.RendererAction.ApplyLast);
            }
        }

        protected override void OnResourcesDispose(ESRI.ArcGIS.ADF.Web.UI.WebControls.MapResourceManager mapResourceManager)
        {
            base.OnResourcesDispose(mapResourceManager);

            // Check whether the dynamic layer is currently added
            if ((System.Web.HttpContext.Current.Session["dynamicLayerAdded"] != null) &&
            ((bool)System.Web.HttpContext.Current.Session["dynamicLayerAdded"]))
            {
                // Remove the dynamic layer from the map service.  We do this so that the layer does not remain in
                // the map service to be seen by other users.
                string targetResourceName = (string)System.Web.HttpContext.Current.Session["targetResourceName"];
                ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal agsMapResourceLocal =
                    mapResourceManager.ResourceItems.Find(targetResourceName).Resource as
                    ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal;

                m_serverObjectStateModifier.RemoveLayer(agsMapResourceLocal,
                    (string)System.Web.HttpContext.Current.Session["dynamicLayerName"]);
            }

            if ((System.Web.HttpContext.Current.Session["RendererChanged"] != null)
            && (bool)System.Web.HttpContext.Current.Session["RendererChanged"])
            {
                foreach (ESRI.ArcGIS.ADF.Web.UI.WebControls.MapResourceItem mapResourceItem in mapResourceManager.ResourceItems)
                {
                    if (mapResourceItem.Resource is ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal)
                    {
                        if (!mapResourceItem.Resource.Initialized)
                            mapResourceItem.InitializeResource();

                        m_serverObjectStateModifier.ApplySimpleRenderers(mapResourceItem.Resource as
                            ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal,
                            ServerObjectStateModifier.RendererAction.ApplyOriginal);
                    }
                }
            }
        }
    }
}