ThinkGeo.com    |     Documentation    |     Premium Support

How to avoid WMS errors?

 When loading a WMS that doesn't work, how do I avoid this error on the web client?  Error: Sys.InvalidOperationException: ImageError error #4001 in control 'SilverlightMapConnector1': AG_E_NETWORK_ERROR


 


I need to trap the error in the Silverlight environment to tell if the WMS layer loaded correctly or not.


Also, how can I tell what is being passed in the GetMap request?  It will help me debug what the problem is.  


 


Thanks,Josh



 


Josh,


 


I am afraid we can't avoid this error if the WMS server is not valid. Geting GetMap request is a good way to debug though, here is how to get it:


 


public partial class Sample : UserControl


    {


        void Sample_Loaded(object sender, RoutedEventArgs e)


        {


            Map1.MapUnit = GeographyUnit.DecimalDegree;


 


            WorldMapKitWmsSilverlightOverlay baseOverlay = new WorldMapKitWmsSilverlightOverlay();


            CustomWMSOverlay rWmsOverlay = new CustomWMSOverlay();


            rWmsOverlay.ServerUris.Add(new Uri("wmssamples.thinkgeo.com/WmsServer.aspx"));


            rWmsOverlay.Parameters.Add("LAYERS", "Countries02");


            rWmsOverlay.Parameters.Add("STYLES", "DEFAULT");


            Map1.Overlays.Add(rWmsOverlay);


 


            Map1.CurrentExtent = new RectangleShape(-135.7, 83.6, 113.5, -53);


        }


    }


 


    public class CustomWMSOverlay : WmsOverlay


    {


        public CustomWMSOverlay()


            : base()


        {


        }


 


        protected override Uri GetTileUri(Uri serverUri, RectangleShape tileExtent, int row, int column, int tileWidth, int tileHeight, double scale)


        {


            Uri tileUri = base.GetTileUri(serverUri, tileExtent, row, column, tileWidth, tileHeight, scale);webclient


            System.Diagnostics.Debug.WriteLine(tileUri.OriginalString);


            return tileUri;


        }


}


 


 



Any more questions please let us know,



James


 



 Thanks for the custom code.  Since users will be entering in WMS URLs on their own in this application, there will be errors.  You're saying there is no way to avoid that script error?  It keeps popping up, multiple times.  That is not the user experience I would like to provide.  I need a graceful way to trap it.   


 


Thanks



 


Hi Josh,
The “Script error” dialog is thrown by the Silverlight by default if there is something wrong happened. Here is a workaround that removing the failed request images from the map, it can prevent the error dialog, but I’m not sure whether it fits your requirements, anyway, please have a try and let us know the further information:

 public class CustomWMSOverlay : WmsOverlay
    {
        private Canvas drawingCanvas;

        public CustomWMSOverlay()
            : base("wms", new List<Uri>(), TileType.MultipleTile)
        { }

        public CustomWMSOverlay(string name, IEnumerable<Uri> serverUris, TileType tileType)
            : base(name, serverUris, tileType)
        { }

        protected override void DrawCore(RectangleShape worldExtent)
        {
            base.DrawCore(worldExtent);

            drawingCanvas = null;
            foreach (UIElement item in ((Canvas)OverlayElement).Children)
            {
                if (item is Canvas && item.GetValue(Canvas.ZIndexProperty).ToString() == "100")
                {
                    drawingCanvas = item as Canvas;
                    break;
                }
            }

            foreach (UIElement item in drawingCanvas.Children)
            {
                if (item is Image)
                {
                    Image image = item as Image;
                    image.ImageFailed += new EventHandler<ExceptionRoutedEventArgs>(image_ImageFailed);
                }
            }
        }

        void image_ImageFailed(object sender, ExceptionRoutedEventArgs e)
        {
            if (drawingCanvas != null)
            {
                Image img = sender as Image;
                drawingCanvas.Children.Remove(img);
            }
        }
    }

Thanks,


Johnny