ThinkGeo.com    |     Documentation    |     Premium Support

Problem in connecting to a WMS Server after upgrade to Map Suite 9.0

Using a WmsRasterLayer with Map Suite 8.0 (without problems) I have been connecting to a WMS server setting WmsRasterLayer.Uri to :



http://<server>/Services/wmsserver.ashx?username=<user>&password=<pw>

The resulting http request then looks like :



http://<server>/Services/wmsserver.ashx?username=<user>&password=<pw>&REQUEST=GetMap&BBOX=<values>&FORMAT=image/png&HEIGHT=498&....<etc>

When I upgrade to Map Suite 9.0 the exact same code result in following request:



http://<server>/Services/wmsserver.ashx?username=<user>&password=<pw>?&REQUEST=GetMap&BBOX=<values>&FORMAT=image/png&HEIGHT=498&....<etc>

Pay attention to the extra '?' after the password in the base uri.

I expect the Map Suite is inserting the extra '?'


Then I changed WmsRasterLayer.Uri to following :



http://<server>/Services/wmsserver.ashx

Then I get NullReferenceException (details added at attachment) when calling ThinkGeo.MapSuite.DesktopEdition.WinformsMap.Refresh()

The exception happens before any call to the WMS server.


I have also tried (but getting same exception) adding username and password as parameters on layer like :



WmsRasterLayer worldLayer = new WmsRasterLayer();
  worldLayer.Uri = new Uri(<WMS server uri>);
  worldLayer.Parameters["username"] = <user>;
  worldLayer.Parameters["password"] = <pass>;

I have even tried (but also getting same exception) setting WmsRasterLayer.Credentials to :



var nc = new NetworkCredential(<user>, <pass>);

What possibilities do I have to add username and password to http request when Map Suite 9.0 is adding '?' to base uri ?


Thanks a lot in advance



I of course also do add username and password to base uri - they disappeared when posting

Hi Jacob, 



Thanks for your information. There is an issue about the request string format which has been fixed in the release version 9.0.0.183 or later and development version 9.0.182.0 or later. But I tested the code you attached here with the previous version(9.0.181.0 and 9.0.0.180) and it works fine  on my side. Please try update the version to the one of them and try the following code. 




WmsRasterLayer worldLayer = new WmsRasterLayer();
 worldLayer.Parameters["username"] = ; 
worldLayer.Parameters["password"] = ;



You can try binding the WmsImageLayer.SendingWebRequest event to catch the request string to make sure if the username and password are missing. 



Any questions please let me know. 



Thanks, 

Peter

Hi Peter


Thanks - I have now got the latest production build V9.0.0.190 to work just fine.



I just wonder that I have to assign username and password for my WMS Server in url aswell as parameters on layer.

So my url has to be like: 



<a href="/Services/wmsserver.ashx?username=" tabindex="0">/Services/wmsserver.ashx?username=</a>[username]&password=[password]

And also as layer parameters like:



WmsRasterLayer worldLayer = new WmsRasterLayer();
  worldLayer.Uri = new Uri;()
  worldLayer.Parameters["username"] = [username];
  worldLayer.Parameters["password"] = [password];

1) If I short up my url to (either with or without ending '?')



<a href="/Services/wmsserver.ashx">/Services/wmsserver.ashx</a>

then no calls to WMS server is made (I have checked through WmsRasterLayer.SendingWebRequest and also using tool Fiddler)



2) And if I do not assign as layer parameters I get "Login failed" from WMS Server.



I have also tried development versions 9.0.0.193 and 9.0.0.196.

Here the behaviour for both versions is different from latest production version.



A) If I short up my url (either with or without ending '?') like in above point 1) - no calls to WMS server is made from ThinkGeo.

B) If I do not assign as layer parameters like in above point 2) - no calls to WMS server is made when refreshing on zoom level 5 to 20, but everything is working refreshing on zoom level 1 to 4.



Regards

Jacob



Hi Jacob, 



Sorry I was unable to reproduce the issues you met.  

#1, I try to use the short URL without parameters and add the parameters using WmsRasterLayer.Parameters, it works fine. 

#2, I try to use the URL with username and password and it works fine. 



The following URLs are the videos I made, please check them out. 



Made request using different ways:

screencast.com/t/tpqL5BHfDcR



Zoom into bigger than 5 level:

screencast.com/t/deSz90fY 



If something misunderstood here please let me know, one sample or video would be better. 



Regards, 

Peter

Hi Peter

  

Thanks for your videos.

  

Still when I use v9.0.0.197 (Production) I have problems when I try to use the short URL without parameters and add the parameters using

WmsRasterLayer.Parameters - still no calls is made to WMS Server. And if I set username and pw in url, it works fine.

  

I think my problems with zoomlevel is because I just changed your sample to use “GeographyUnit.Meter” instead of

"GeographyUnit.DecimalDegree" - without other changes.

So I will ask if you can create another sample like “screencast.com/t/tpqL5BHfDcR” which is using “GeographyUnit.Meter” ?



Thanks

Jacob


Hi Jacob,



#1, I did tests use v9.0.0.197 and it still work fine with the short url.



#2, the reason of ZoomLevel problem is that the default SRS of our test wms service is EPSG:4326, if you change the Unit to GeogrphyUnit.Meter you need to pass the SRS to wms service. 



Here attached is the sample show how to change the MapUnit to GeographyUnit.Meter.



Hope it’s helped.



Thanks,

Peter

WinWms.zip (10.6 KB)

Hi Peter


The WinWms.zip sample helped me to find more details.

I will try to get a tial access for you to connect to our partners WMS server


My problem in getting a NullReferenceException might happen when using a WMS server with a url ending on ".ashx"

Maybe you can test or check if that could be possible ?


I have attached picture of my sample code that is working with my user and pw.

If I change to the short url I will get a NullReferenceException.


I will be back.


Regards

Jacob



Ups… here is the screen shot…





Hi Jacob, 
  
 Thanks for your further information here. I’m sorry that I was unable to connect to the wms server as I don’t have the correct username and password, could you please share a trial connection to me? you can send it to forumsupport@thinkgeo.com or append here.  
  
 I tried something and found that it got an exception with message “Login failed” while requesting the “wms.cowi.dk/Services/COWI.WMS.Proxy/wmsserver.ashx?SERVICE=WMS&REQUEST=GetCapabilities” I think the server do some validation in the GetCapabilities request and the same result as the v 8.0.357.0. I guess the reason is that the Capabilities.xml is not request successfully and there are two options to work it around. 
  
   1. use the url with password and username. 
   2. remove the authorize when request the capabilities.xml 
   
  
 Thanks, 
 Peter

Hi Peter



Now I got a trial login for you, as found in attached of code sample screenshot.

The login is working until January 31.



This code sample is working.

As shown username and password has to be added as parameters on layer aswell as they need to be in the url like below:


"<a href=“wms.cowi.dk/Services/COWI.WMS.Proxy/wmsserver.ashx?username=Seges_test&password=160C52B6” tabindex=“0”>wms.cowi.dk/Services/COWI.WM…d=160C52B6</a>“

But I would expect from your earlier post that I should be able to only define username and password on layer and then use url as below:


”<a href=“wms.cowi.dk/Services/COWI.WMS.Proxy/wmsserver.ashx”>wms.cowi.dk/Services/COWI.WM…erver.ashx</a>"

The WMS Server is not ours and we cannot change it.



Thanks

Jacob


WorkingSample1.JPG (40.8 KB)

Hi Jacob, 



Thanks for sharing a trial connection again. I think you need to pass the username and password to the WMS server, as I tested the trial connection I found that the server has the validation process when request the capabilities.xml, if not pass the user name and password it returns Login failed and then throws an NullReferenceException with the message: "Object reference not set to an instance of an object.", the same result as the version 8.0.357.0. Please make sure that the v 8.0 can work well, if so could you please tell me what the version do you reference in v 8.0?



There are some options to pass the user name and password to server. 



1. use the URL with username and password. 

2. rebuild the request in the SendingWebRequest event. 



Thanks, 

Peter

Hi Peter



With MapSuite V9 and the short url - I expect that I pass in username and password also when requesting capabilities.xml as I have specified username and password as parameters on layer.



Until now we have been using V8.0.0.351.

Here we have been using the long url which includes username and password.

But when upgrading to V9 - we cannot continue only using this long url as GetMap does not take username and password from url.



Thanks

Jacob


Hi Jacob,



Sorry for delay on the reply. I tested based on the server you shared last week, and it worked well, I don’t know whether there is something different between the trial account and your account. Please try using both the long URL (with username and password) and worldLayer.Parameters[“username”] = [username];
worldLayer.Parameters[“password”] = [password];.


If it still doesn’t work, could you please send the capabilities.xml which is saved in “%temp\MapSuite\WmsLayer%” to forumsupport@thinkgeo.com  and share a trial account again. It’ll help us to compare if there is something different between trial account and your account.




Thanks,
Peter