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