|     Blog    |     Wiki    |     Support

WMS Feature Info


I’ve been asked to be able to query a wms layer for details about the objects, so I put the following code into the map click event.

        var info = wms.GetFeatureInfo(new ScreenPointF(e.ScreenX, e.ScreenY));

However, this returns an error: (401) Unauthorized.

The credentials of the layer are there, so I don’t understand why this error comes up.

Any ideas?


Hi Damian,

Thanks for raising this up, it’s proved to be a bug in the SDK, it has been fixed now, I’m not sure what .NET version you are working on, if .NET Framework, please get the latest ThinkGeo.MapSuite.Layers.Wms with versions higher than or equal to 11.0.0-beta018, if .NET Core, please get the latest ThinkGeo.Core with versions higher than or equal to 13.0.0-beta054 to get it fixed.


Thanks Johnny.

I’m not actually wanting to update libraries at this time. Is there a workaround?


Hi Demian,

Please try the workaround as following:

// Attach SendingWebRequest event to WmsRasterLayer
wmsRasterLayer.SendingWebRequest += WmsRasterLayer_SendingWebRequest;

// Assign the credential to the request
 private void WmsRasterLayer_SendingWebRequest(object sender, SendingWebRequestEventArgs e)
     e.WebRequest.Credentials = ((WmsRasterLayer)sender).Credentials;


Hi Johnny,

Getting closer. Now I get the following error when trying to use GetFeatureInfo.

Message=Invalid value for INFO_FORMAT: text/xml
at ThinkGeo.MapSuite.Layers.WmsRasterSource.HandleResponseCore(WebRequest request)
at ThinkGeo.MapSuite.Layers.WmsRasterSource.GetFeatureInfoCore(ScreenPointF screenPointF, String infoFormat, Int32 maxFeatures)
at ThinkGeo.MapSuite.Layers.WmsRasterLayer.GetFeatureInfo(ScreenPointF screenPointF, String infoFormat, Int32 maxFeatures)
at ThinkGeo.MapSuite.Layers.WmsRasterLayer.GetFeatureInfo(ScreenPointF screenPointF)
at WMS_v10.Form1.WinformsMap1_MapClick(Object sender, MapClickWinformsMapEventArgs e) in C:\Users\damian\OneDrive -\Visual Studio Projects\Projects\WMS_v10\WMS_v10\Form1.cs:line 102
at ThinkGeo.MapSuite.WinForms.WinformsMap.OnMapClick(MapClickWinformsMapEventArgs e)
at ThinkGeo.MapSuite.WinForms.WinformsMap.M1M=(InteractionArguments interactionArguments)
at ThinkGeo.MapSuite.WinForms.WinformsMap.J1M=(Object sender, WFM= e)
at ThinkGeo.MapSuite.WinForms.MouseEventAnalyzer.OnMouseEvent(WFM= e)
at ThinkGeo.MapSuite.WinForms.MouseEventAnalyzer.VFM=(Double screenX, Double screenY, Double worldX, Double worldY)
at ThinkGeo.MapSuite.WinForms.WinformsMap.KlM=(Object sender, MouseEventArgs e)
at System.Windows.Forms.MouseEventHandler.Invoke(Object sender, MouseEventArgs e)
at System.Windows.Forms.Control.OnMouseMove(MouseEventArgs e)
at System.Windows.Forms.Control.WmMouseMove(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at WMS_v10.Program.Main() in C:\Users\damian\OneDrive -\Visual Studio Projects\Projects\WMS_v10\WMS_v10\Program.cs:line 19

Cool! Demain, the service has been authorized now, the problem is that the WMS service requested doesn’t support “text/xml” as “INFO_FORMAT”, “text/xml” is the default “GetFeatureInfo” format in ThinkGeo SDK, it’s hard-code in method “GetFeatureInfo(ScreenPointF screenPointF)”.

The parameter “INFO_FORMAT” is a mandatory parameter indicates what format to use when return feature information. Supported values for a GetFeatureInfo request on a WMS server are listed as MIME types in one or more <Request><FeatureInfo><Format> elements of its service metadata. The entire MIME type string in is used as the value of the INFO_FORMAT parameter. To get the detail of the metadata, please visit the link “http[s]://[service host]?version=1.3.0&service=wms&request=GetCapabilities” (Given the WMS service is 1.3.0, it may be 1.1.1 sometimes) in browser or call the method “GetServerCapabilitiesXml” of “WmsRasterSource”. Then we can see what “INFO_FORMAT” supported on service. Once determined what “INFO_FORMAT” supported, please use method “GetFeatureInfo(ScreenPointF screenPointF, string infoFormat)” or “GetFeatureInfo(ScreenPointF screenPointF, string infoFormat, int maxFeatures)” instead.

Hope all works for you, pretty close now.


Hi Johnny,

So I’ve found the info format now and put that in and I don’t get any errors anymore. One step closer.
However, the GetFeatureInfo object that is returned never has any entries.

I took a look at the sending web request uri that is formed from the call and that definitely works. It’s like the object isn’t assigned when it’s returned.

For the moment, I’m just taking the web request uri and parsing it out with a WebClient DownloadString function, so I am good, but I gather there may be another bug in the GetFeatureInfo function and it would be nice to have it working directly.


Hi Damian,

I appreciate your feedback, that’s true, it’s a bug in SDK, the method GetFeatureInfo only supports “text/xml” now, I have submit the issue to internal task tracking system, developers can dig into further later. Good news is that it doesn’t delay your development. Thanks a lot again.