ThinkGeo.com    |     Documentation    |     Premium Support

Using WMS Server with WPF Client

Hi Guys,


This issue is actually with the WPF client rather then the server but it has to do with how the client is talking to the server.


Basically the WPF client is way too chatty right now - to generate a relatively small map it is making some 25-30 requests from the TiledWMSLayer object.  Each of these requests covers what appears to be a subset of the map extent being displayed on the client. Because each request is fired off sequentially from the client (which makes sense - no issue there) you end up with 30 batches of tile round trips to complete the map. When I run the same test with the Winforms version of the client I see that version is making a single request for the entire map - so it makes one request to the server, the server then generates all the tiles for that request and they are returned in a single roundtrip. This makes the Winforms version of the client faster then the WPF Version by a factor of 10 over the internet. Also all the tiles are cached on the server so there is no rendering happening on the server it's just returning the cached tiles and the map extent on the client is not changing over the course of this sequence of requests, this is a test where the map is getting requested on start-up before there is any user interaction. I would say that is really the same scenario as zooming though. Even panning I think should be handled with a single map request when the pan gets completed - otherwise it just ends up taking longer for the tiles to update.


I have put a zipped up wpf client app in our directory on your ftp site which you can use to connect to our server over the internet and test the behavior.  I am logging on the client right before the DrawCore method of the TileWMSLater object gets called and then also on my Server from the GetMapCore method. I have added a request id parameter to the request url so that i can link the client DrawCore method calls with the corresponding GetMapCore calls being made on the server. Please just let me know if you need any additional information.


Thanks,


Chris


 


 


 



Hi, Christopher


Thanks for your information about this question.
Yes, you are correct. If you don’t change the TileType for the LayerOverlay, and by default the wpf client will send multiple tile image requests and also each of these requests covers a subset of the map extent that represent the entire map.  
As for the TileType which is defined at TileOverlay that is the super class of LayerOverlay.
So if want to implement the same result with the Winform client-side, please set the TileType of LayerOverlay which you used to load layers to SingleTile.
Also I have downloaded the zipped wpf client app in your directory on our ftp site and give it a try. Also I have checked the log file on the client-side and it works as expected.
If I misunderstand your meaning please correct me.
Thanks,
Khalil

Khalil - this does improve the situation, although not quite as much as I had hoped it would. Also there is no tile buffering on the client in SingleTile mode but i will raise that issue on the WPF board.  
  
 I’ve pasted my updated log files for a map generated using SingleTile mode on the client below. You can see that it is still taking a very long time for the server to return cached tiles and I guess the question I have is, if all the tiles are now being generated based on one request from the client, and GetMapCore is only taking between 15-35ms to run - then why is it only getting called roughly twice a second? It seems like there is still some kind of bottleneck going on there. 
  
  
 On the client - 
  
 8/20/2010 9:37:33 AM, THREAD ID: 1 ==> Request ID: 1 (clock is off from server that is why time is later then first server call) 
  
   
  
 On the server- 
  
 8/20/2010 9:37:30 AM, THREAD ID: 9 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:31 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:31 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:32 AM, THREAD ID: 9 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:32 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:33 AM, THREAD ID: 9 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:34 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:34 AM, THREAD ID: 22 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:34 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:35 AM, THREAD ID: 9 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:36 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:36 AM, THREAD ID: 22 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:36 AM, THREAD ID: 9 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:37 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:37 AM, THREAD ID: 22 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:37 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:38 AM, THREAD ID: 22 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:38 AM, THREAD ID: 22 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:39 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:39 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:40 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:40 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:41 AM, THREAD ID: 9 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:41 AM, THREAD ID: 22 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:42 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:42 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:42 AM, THREAD ID: 9 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:43 AM, THREAD ID: 22 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:44 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:44 AM, THREAD ID: 9 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:44 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:45 AM, THREAD ID: 22 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:45 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:46 AM, THREAD ID: 9 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:46 AM, THREAD ID: 22 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:47 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:47 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:48 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:48 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:48 AM, THREAD ID: 23 ==> RequestID: 1 Total Rendering Time: 15 
  
 8/20/2010 9:37:49 AM, THREAD ID: 17 ==> RequestID: 1 Total Rendering Time: 31 
  
 8/20/2010 9:37:49 AM, THREAD ID: 22 ==> RequestID: 1 Total Rendering Time: 31

Hi, Christopher


I have got your problem. So I tried to use the WMSWPFClient client app to connect to your server but it can’t work, and then I remote to the server and I found there is no UPSPlugin assembly and I also couldn’t visit the WMSService through browser, the error shows as below:


Anyway, I suggest that you give a try on your deployment server and log the time information for the client-side and server-side. As you know, there are many reasons that affect the render speed of client-side, such as network jam.
And also if you use wpf as client, I suggest that you can try to use the TiledWmsOverlay which is one alternative solution in wpf edition, if set the TileType of it as SingleTile and you will only get one request on the server and so that there is only one single roundtrip. But for the TiledWmsLayer of LayerOverlay will still send multiple requests to server just the same as the log you have pasted in the last post.
Thanks,
Khalil

Hi Khalil. Yes the server wasn’t working for a while this morning and I haven’t figured out why yet why but it seems to be working again now. I can tell you from having done some more testing that the slow time i posted above appears to be due to using the client from behind a proxy server - so I am setting the WebProxy with this code - 
  
 if (WebRequest.DefaultWebProxy != null) 
 { 
    WebProxy webProxy = new WebProxy(WebRequest.DefaultWebProxy.GetProxy(tiledWmsLayer.ServerUri)); 
    webProxy.Credentials = new NetworkCredential(username, password); 
    tiledWmsLayer.WebProxy = webProxy; 
 } 
  
 I’ve included a server log below for a small map request made from behind the proxy server this morning. I think the slow time has to do with this because when i run it from my home it is only taking 5 seconds between the first and last GetMapCore call’s being made on the server - and this is roughly what i would expect you to see when you run the client. Is it possible that this object could be slowing things down from the client? What i would like is to be able to determine if the problem is occuring on the client - through perhaps some kind of locking going on with this object or if things are being held up by the proxy server. Maybe you guys could add some optional logging capability to help figure this out?  Also Khalil, even the 5 seconds when running it over the internet without a proxy server is about 2 seconds longer then we were hoping for since all the tiles are just cached on the server. It seems like usually less then a seconds is spent in GetMapCore retreiving all the tiles and then if say a larger map was 30 tiles that were 15-30KB each that should download in under 1.5 seconds if you download bandwidth of 600KB/sec.  
  
 So potentially you should be able to cache a map from tiles cached on the server in 3 seconds. (and these times are just the duration betweend the first and last GetMapCore call’s made on the server so I realize there may be close to another second involved in the actual tile) 
  
  
 Server Log - 
 8/23/2010 10:15:40 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:40 AM, THREAD ID: 23 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:41 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:41 AM, THREAD ID: 25 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:42 AM, THREAD ID: 16 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:42 AM, THREAD ID: 23 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:43 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:43 AM, THREAD ID: 25 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:44 AM, THREAD ID: 16 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:44 AM, THREAD ID: 23 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:45 AM, THREAD ID: 16 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:45 AM, THREAD ID: 23 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:45 AM, THREAD ID: 25 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:46 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:46 AM, THREAD ID: 16 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:46 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:47 AM, THREAD ID: 16 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:47 AM, THREAD ID: 23 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:48 AM, THREAD ID: 25 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:48 AM, THREAD ID: 23 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:49 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:49 AM, THREAD ID: 16 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:50 AM, THREAD ID: 25 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:50 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:50 AM, THREAD ID: 23 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:51 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:51 AM, THREAD ID: 16 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:52 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:52 AM, THREAD ID: 23 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:53 AM, THREAD ID: 16 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:53 AM, THREAD ID: 16 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:54 AM, THREAD ID: 25 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:54 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:55 AM, THREAD ID: 23 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:55 AM, THREAD ID: 25 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:56 AM, THREAD ID: 16 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:56 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:56 AM, THREAD ID: 25 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:57 AM, THREAD ID: 23 ==> TileID: 1 Total Rendering Time: 15 
 8/23/2010 10:15:57 AM, THREAD ID: 26 ==> TileID: 1 Total Rendering Time: 0 
 8/23/2010 10:15:58 AM, THREAD ID: 25 ==> TileID: 1 Total Rendering Time: 31 
 8/23/2010 10:15:58 AM, THREAD ID: 25 ==> TileID: 1 Total Rendering Time: 31 


Hi, Christopher


I’m not sure where there is relationship between the slow time problem and proxy server. Anyway, I give a try on my local machine which is Windows 7 64-bit Enterprise and Inter(R) Core2 Quad CPU. The server is IIS 7.5 with the WorldMapKit data (about 24.8G). And in order to get more precise result and I don’t use any proxy server and please see the test codes for full detail in the attached codes file.
First off I add one plug-in for WorldMapKit data and wpf client using LayerOverlay which includes TiledWmsLayer and its TileType is SingleTile. And later I add necessary log information on the server-side (GetMap method of WmsHandler) and client-side (DrawCore method of TiledWmsLayer), and then deploy the server on IIS and start the wpf client with the same BoundBox you had set to me.
The test result you can see from the attached ResultForTiledWmsLayer zipped file. First of all, I have cached the tiles image included in the CurrentExtent on the server, and then I request it five times and every time it will request 12 cached tiles on the server. I guess maybe this is the reason cause the slow time problem. Just as I have mentioned in the last reply, even though you have set the TileType as SingleTile, but if you use the TiledWmsLayer to get tile image from server and it still sent multiple requests to server just like MultipleTile tile type.
Also I have done another test using TiledWmsOverlay. The test result you can see from the attached ResultsForTiledWmsOverlay zipped file. I just set the TileType of TiledWmsOverlay as SingleTile and it works the same with Winforms version and makes a single request for the entire map and then server generate all tiles for that request and there exists only one single round-trip. You can see the big difference in the test results.
If you still have any questions please let me know.
Thanks,
Khalil

ResultsForTiledWmsOverlay.zip (548 Bytes)
ResultForTiledWmsLayer.zip (777 Bytes)
codes.txt (1.99 KB)

Hi Everybody


I am trying to buid a silverlight application that accesses WMS. But I am having problem with how to specify 'ActiveLayerNames'  inorder to access an approapriate plugin and retrieve the map. Can any one give me a sample code of how to access WMS from a silverlight application. 


Best Regards,


Vincent



Hi, Vincent 
  
 We have replied your post on another post, please refer to it with the link below: 
 gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/38/aft/8050/afv/topic/Default.aspx#19644 
  
 Thanks, 
  
 Khalil