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

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

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



lunedì 4 maggio 2009

Debug una SOE (Server Object Extension)

Individuare e correggere gli errori in una SOE non è un'operazione alquanto immediata.
E' possibile far implementare alla nostra classe l'interfaccia
ILogSupport che possiede InitLogging, che ci permette di inizializzare il nostro oggetto di log.

#region ILogSupport Members
private ILog2 m_log;
 
public void InitLogging(ILog log)
{
     m_log = log as ILog2;
}
 
#endregion
 
 
Utilizziamo ILog2 perchè ci dà qualche metodo in più rispetto a ILog
 
 
public void Construct(IPropertySet props)




{
     try
     {
                m_layerName = props.GetProperty("LayerName") as string;
                m_fieldName = props.GetProperty("FieldName") as string;
     }
     catch (Exception ex)
     {
          m_log.AddMessage(1, 8000, "VegUtilsSOE custom error. Error reading properties: " + ex.Message + " " + props.Count.ToString());
          
    return;
     }
...
 
Utilizzando la ILog2 possiamo usare anche il metodo AddMessageEx:
 
m_log.AddMessageEx(1, System.Reflection.MethodBase.GetCurrentMethod().Name, 8000, 0.0, "VegUtilsSOE custom error. Error reading properties: " + ex.Message + " " + props.Count.ToString());
 
Per ulteriori dettagli sul log di ArcGis Server, vedere:
 
http://webhelp.esri.com/arcgisserver/9.3/dotNet/interpret_logs_oview.htm
http://webhelp.esri.com/arcgisserver/9.3/dotNet/log_msg_structure.htm
http://webhelp.esri.com/arcgisserver/9.3/dotNet/log_codes.htm
http://webhelp.esri.com/arcgisserver/9.3/dotNet/log_codes_core_server.htm
http://webhelp.esri.com/arcgisserver/9.3/dotNet/log_codes_map_services.htm
 
I log potranno poi essere analizzati nell'ArcGIS Server Manager.
 
 
 


Un altro metodo, se più articolato, è quello di, in fase di classico debug dell'applicazione,
connettersi al processo in corso. Se tutti i servizi di ArcGIS Server sono 'stoppati', gli unici 
processi ArcSOC che vediamo sono (in questo caso) il 3540 ed il 3504, cioè quelli addetti
alla gestione del Log di ArcGIS Server ed alla gestione della cartelle di output.
 



Impostiamo, per il servizio che vogliamo 'debuggare', nella sezione pooling: polled e 1 come minimo numero di istanze.



Ora facciamo partire il nostro servizio (in questo caso Yellowstone):






A questo punto, se riguardiamo il task manager, avremo:
Come si può vedere, si è aggiunto il processo 1416 che corrisponde alla prima istanza del nostro servizio.


Ora creiamo un progetto di test per debuggare la nostra SOE:

Impostiamo un breakpoint prima di richiamare la SOE (in questo caso prima della linea


IVegResultsSOE result = vegutils.sumVegetationType(541131, 4908614, 5500.0);)



A questo punto, quando si è in debug e prima di chiamare il metodo da verificare, connettersi al processo (in questo caso il 1416):








Infine è importante, prima di fare il debug, impostare il progetto della SOE a non essere compilato:

Scarica qui l'esempio (i dati utilizzati sono in ..Programmi\ArcGIS\DeveloperKit\SamplesNET\data\YellowStone)



ArcGis Server 9.3 introduce la possibilità di collezionare dei rapporti di errori dal server che poi possono essere inviati via e-mail al team di sviluppo ESRI a ArcGISErrorReport@esri.com. Questi rapporti saranno analizzati con l'intento di capire e correggere gli errori nelle future release o service pack.
Alcuni errori non sono riproducibili e normalmente accadono quando il sistema è sovraccarico o siamo in presenza di un errore hardware. I contenuti degli errori danno al team di sviluppo ESRI una visione di come è meglio ingegnerizzare il software per evitare questi errori in futuro.


Se riscontri errori riproducibili, puoi inviare un rapporto dell'errore. ArcGIS Server può essere configurato per memorizzare questi errori o rapporti di crash in una directory a tua scelta.
I processi ArcGIS Server Container (ArcSOC.exe) non possono 'crashare' in modo predefinito;
comunque possono:
- non rispondere
- comportarsi in maniera inaspettata e scrivere errori nei fili di log
- essere costretti a lascire dopo il tempo di utilizzo o quando si cerca di ripristinare una connessione di Workspace
Se il tuo sito riscontra questi errori e questi ostacolano il flusso di lavoro, considera di abilitare il rapporto errori di ArcGIS server che puoi poi inviare alla ESRI. Il rapporto errori di ArcGIS Server richiede che il processo ArcSOc.exe 'crashi'. Per abilitare ciò, devi impostare una proprietà ArcGIS Server chiamata <crashdumpmode>. Quando essa è impostata a 1, le eccezioni nel servizio o nelle estensioni del servizio porteranno il processo ArcSOC.exe a 'crashare' e scrivere le informazioni nel log file. Quando è impostato a 2, il processo ArcSOC.exe 'crasherà' e genererà un rapporto di errore in aggiunta alla scrittura nel log file.
I seguenti messaggi appariranno nel log file quando è impostato a 1 o 2 e un ArcSOC.exe 'crasha': Container process <numeric process ID> has crashed on machine <name of SOC machine>.
Segui questi passi per abilitare la reportistica di errore per ArcGIS Server:
1) Ferma il servizio ArcGIS Server Object Manager . In Windows, trovalo nella lista dei servizi (in esegui digita services.msc);


2) in \server\system apri il file server.dat con notepad;

3) aggiungi i seguenti elementi CrashDump al file server.dat:

<Server>
  ...
  <Properties>
    ...
    <CrashDumpMode>2</CrashDumpMode>    
    <CrashDumpDir>[path to error reports]</CrashDumpDir>  
</Properties>
</Server>




Nell'esempio sopra, [path to error reports] è il percorso Windows dove vuoi memorizzare i rapporti degli errori. Questo percorso dovrà essere accessibile agli utenti SOC e SOM. Se la tua configurazione contiene multiple macchine, il percorso dovrà essere un percorso UNC in una posizione condivisa o un percorso locale che punta alla stessa posizione per ogni SOC;
4) salva il file Server.dat;
5) fai ripartire il servizio ArcGIS Server Object Manager


Non ci sono impatti negativi di prestazioni nell'abilitare i rapporti di errore. Comunque, assicurati di ripulire la cartella degli errori periodicamente.
Per disabilitare i rapporti di errore, rieseguire i passi precedenti modificando nel punto 3 il valore di CrashDump a 0.
Puoi inviare i tuoi rapporti di errore a
ArcGISErrorReport@esri.com. Puoi facoltativamente includere i tuoi contatti e ulteriori dettagli che reputi interessanti quando il crash si verifica. Se scegli di includere i tuoi riferimenti, ESRI potrebbe chiederti informazioni ulteriori sul crash. Fornire queste informazioni è facoltativo. Ad eccezione di quando lo staff di sviluppo richiede maggiori informazioni riguardo l'errore, non potrai essere contattato sullo stato del tuo rapporto. ESRI non può fornire dettagli riguardo lo stato del tuo rapporto di errore, a meno che invii questo errore associato ad una esistente richiesta di supporto.





namespace TestSOE
{
    class Program
    {
        static void Main(string[] args)
        {
 
            GISServerConnectionClass agsconn = new GISServerConnectionClass();
            agsconn.Connect("localhost");
 
            IServerObjectAdmin soa = agsconn.ServerObjectAdmin;
            IServerObjectConfiguration2 soc = soa.GetConfiguration("Yellowstone", "MapServer") as IServerObjectConfiguration2;
            soa.StopConfiguration("Yellowstone", "MapServer");
            soc.set_ExtensionEnabled("VegUtilitiesSOE_CSharp", true);
            IPropertySet props = soc.get_ExtensionProperties("VegUtilitiesSOE_CSharp");
            props.SetProperty("LayerName", "Vegetation");
            props.SetProperty("FieldName", "PRIMARY_");
            soa.UpdateConfiguration(soc);
            soa.StartConfiguration("Yellowstone", "MapServer");
 
 
 
            IServerObjectManager som = agsconn.ServerObjectManager;
            string servertype = "MapServer";
            string serverobjectname = "Yellowstone";
            IServerContext servercontext = som.CreateServerContext(serverobjectname, servertype);
            IMapServer mapserver = (IMapServer)servercontext.ServerObject;
            IServerObjectExtensionManager soext_manager = (IServerObjectExtensionManager)mapserver;
            IServerObjectExtension soext = soext_manager.FindExtensionByTypeName("VegUtilitiesSOE_CSharp");
            IVegUtilsSOE vegutils = (IVegUtilsSOE)soext;
 
            IVegResultsSOE result = vegutils.sumVegetationType(541131, 4908614, 5500.0);
 
            IRecordSet stats = result.Stats;
 
        }
    }
}

Nessun commento: