-----------------------------------

Acquista i software ArcGIS tramite Studio A&T srl, rivenditore autorizzato dei prodotti Esri.

I migliori software GIS, il miglior supporto tecnico!

I migliori software GIS, il miglior supporto tecnico!
Azienda operante nel settore GIS dal 2001, specializzata nell’utilizzo della tecnologia ArcGIS e aderente ai programmi Esri Italia Business Network ed Esri Partner Network

-----------------------------------



sabato 13 febbraio 2010

Server Context Empty

Il server context è un puntatore ad un processo (ArcSOC.exe).



E' possibile creare un nuovo context od ottenere un context da un servizio GIS già esistente (ad esempio un servizio di mappa).

Il server context gestisce la comunicazione tra il server object e gli ArcObjects.

Bisogna prestare molta attenzione nella gestione del ciclo di vita del server context rilasciandolo opportunamente (metodo ReleaseContext).

Quando a livello di ADF non abbiamo la funzionalità GIS di fine grained possiamo, ad esempio, passare direttamente agli ArcObjects.

Tutti gli oggetti ArcObjects devono essere creati nel context del server con CreateObject passando il ProgID della classe di oggetto componente (coclass).
Non utilizzare mai il new quando si dichiarano tipi ArcObjects!!!

In questo esempio, dopo aver fatto la connessione ad ArcGIS Server con AGSServerConnection, accediamo alla SOM per creare un Server Context (spazio per utilizzare gli ArcObjects).
Nel caso specifico creiamo un server context vuoto, cioè non associato ad un servizio esistente ( yourSOM.CreateServerContext("","") ). A questo punto utilizziamo puro ArcObjects.

namespace Studioat.Samples
{
    [ErrorBehavior(typeof(WCErrorHandler))]
    public sealed class WCService : IWCService
    {
        public List<Streets> GetStreets(double x, double y, double distance)
        {
            IServerContext serverContext = null;
            List<Streets> streets = new List<Streets>();
            try
            {
                // Connection to ArcGIS Server
                Identity identity = new Identity();
                identity.UserName = ConfigurationManager.AppSettings.Get("userAGS");
                identity.Password = ConfigurationManager.AppSettings.Get("passwordAGS");


                using (AGSServerConnection agsServerConnection = new AGSServerConnection(ConfigurationManager.AppSettings.Get("hostnameAGS"), identity))
                {
                    try
                    {
                        agsServerConnection.Connect();
                    }
                    catch (ServerHostNullException)
                    {
                        throw new FaultException(WCRes.ServerHostNullException);
                    }
                    catch
                    {
                        throw;
                    }

                    // Reference SOM
                    IServerObjectManager serverObjectManager = agsServerConnection.ServerObjectManager;
                    serverContext = serverObjectManager.CreateServerContext("", "");




                    IWorkspaceFactory2 workspaceFactory = (IWorkspaceFactory2)serverContext.CreateObject("esriDataSourcesGDB.FileGDBWorkspaceFactory");
                    IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspaceFactory.OpenFromFile(@"yourpathgdb\Atlanta.gdb", 0); //path with access user soc
                    IFeatureClass featureClass = featureWorkspace.OpenFeatureClass("streets");
                    ISpatialFilter spatialFilter =(ISpatialFilter) serverContext.CreateObject("esriGeoDatabase.SpatialFilter");
                    IPoint point = (IPoint)serverContext.CreateObject("esriGeometry.Point");
                    point.PutCoords(x, y);
                    ITopologicalOperator topologicalOperator = point as ITopologicalOperator;

                    spatialFilter.Geometry = topologicalOperator.Buffer(distance);
                    spatialFilter.GeometryField = featureClass.ShapeFieldName;
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;

                    using (ComReleaser comReleaser = new ComReleaser())
                    {


                        IFeatureCursor featureCursor = featureClass.Search(spatialFilter,true);
                        comReleaser.ManageLifetime(featureCursor);
                        IFields fields = featureClass.Fields;
                        int idxName = fields.FindField("NAME");
                        int idxType = fields.FindField("TYPE");
                        IFeature feature = featureCursor.NextFeature();

                        while (feature != null)
                        {
                            streets.Add(new Streets() { Type = Convert.ToString(feature.get_Value(idxType)), Name = Convert.ToString(feature.get_Value(idxName)) });

                            feature = featureCursor.NextFeature();
                        }

                    }




                }
            }
            catch (Exception ex)
            {
                throw new FaultException(ex.Message);
            }
            finally
            {

                if (serverContext != null)
                {
                    serverContext.ReleaseContext();
                }
            }

            return streets;
        }

    }


    public class WCErrorHandler : IErrorHandler
    {
        // Provide a fault. The Message fault parameter can be replaced, or set to
        // null to suppress reporting a fault.


        #region IErrorHandler Membri di

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
        }

        // HandleError. Log an error, then allow the error to be handled as usual.
        // Return true if the error is considered as already handled

        public bool HandleError(Exception error)
        {
            using (TextWriter tw = File.AppendText(@"c:\Temp\errorVegetation.txt"))
            {
                if (error != null)
                {
                    tw.WriteLine("Exception: " + error.GetType().Name + " - " + error.Message);
                }
                tw.Close();
            }
            return true;
        }

        #endregion
    }


}

Potete trovare il FileGeodatabase Atlanta.gdb, utilizzato nell'esempio, in c:\Programmi\ArcGIS\DeveloperKit\SamplesNET\data\

Scarica qui la soluzione

Vi segnalo un articolo tecnico relativo all'utilizzo di server context empty
Problemi di time out con server context empty

Nessun commento: