ThinkGeo.com    |     Documentation    |     Premium Support

Map is sometimes "null" in controller action method

Hello,


I am using the following code to request data from the server:




map.ajaxCallAction('Action', 'ActionMethod', null, function (ajaxResponse) {
...
});


The action method signature is like this:




[MapActionFilter]
[OutputCache(Duration = 0, VaryByParam = "None")]
public JsonResult ActionMethod(ThinkGeo.MapSuite.MvcEdition.Map map, GeoCollection<object> args) {
...
}


Most of the time this works fine, but sometimes "map" is null. Do you have any idea why this can happen?



Hello Sindre, 
  
 Thanks for your post, but sorry, we didn’t recreate your problem with the code you provide. 
  
 Is that possible you can provide us a sample that can recreate the problem? 
  
 Sorry for the inconvenience. 
  
 Regards, 
  
 Gary 


Gary, 
  
 As I said, the problem is not consistent. It happens maybe in 1 out of 50 times. But when it first happens, all further requests fails (map remains null).

Hello Sindre, 
  
 Thanks for your further information, "But when it first happens, all further requests fails (map remains null)." this situation looks like session time out, can you check if you can get the session information when the problem happen? 
  
 Regards, 
  
 Gary

I think that I have also seen this issue mostly speaking when the page load for the first time and if there is an ajax request involved like setting the current location on the map.  The only way to make it to work is to refresh the page and then the application work as expected. 
  
 jm

Hi Jean-Marie, 
  
 Is it possible for you to make a demo and send it to us? I guess that’s the most efficient way to recreate the problem.  
  
 Thanks, 
 Johnny

Hi Johnny 
  
 I shall try to build a sample for you to test.  I ll you know when done 
  
 jm.

Hello Jean-marie, 
  
 Thanks for your help, you can send the sample to forumsupport@thinkgeo.com
  
 Regards, 
  
 Gary

Hi, 
  
 I do confirm that I have the exact same issue.  When using the Ajax call available with the map control.  I thought that it was only at page load from server but in fact I have a first call using the Ajax method to locate where the device is currently located. In order to do so I do call the navigator service to get the current device coordinate and then I call the mvc controller where I do some processing then I return the the coordinate for the map to center and zoom to.  On the client side I do wait for the map created event before issuing any kind of call to the server. I do this by testing a flag that is set to true when the map created event is triggered if flag false I do use a set timeout to check again after let say 250ms. And yes time to time the map parameter of the method inside the mvc controller is null. The result is that after that we get a pink map and nothing work any more only refreshing the page will fix the issue. 
  
 Hope this help you to understand the problem better. 
  
 Jm

Hi Jm, 
  
 To make sure I understood you clearly, please allow me to do some confirmation here: 
  
 1.The map is “null” only appears when doing a AjaxCall for the first time of the page, in other words, when the view is starting loading, an Ajax call is called to pass the device coordinate to the server side “action of the controller”.  
 2.There is a flag on client side, which will be set to true if the “OnMapCreated” event is triggered. If it’s true, the AjaxCall mentioned in #1 will be called.    
  
 Please take a check and anything wrong I understood here; please feel free to correct me.  
  
  
 Thanks, 
 Johnny 


In my situation, it DOES NOT happen on initial page load. I have a javascript timer which calls an MVC controller method periodically and makes some modifications to the map, then does a "layer.redraw()". 



It can work fine for several minutes, then suddenly the "map" parameter is null.


I can also add that when this happens, the following error is displayed in the Chrome console window:



Resource interpreted as Image but transferred with MIME type text/plain: "localhost/tile_GeoResource.axd?OVERLAYID=DynamicOverlay&FORMAT=image…4693191.6103125,-1255443.678125,5006277.678125&WIDTH=256&HEIGHT=256&ZOOM=7". extension_GeoResource.axd:515
OpenLayers.Tile.Image.OpenLayers.Class.renderTile extension_GeoResource.axd:515
OpenLayers.Tile.Image.OpenLayers.Class.draw opl_GeoResource.axd:479
OpenLayers.Layer.Grid.OpenLayers.Class.spiralTileLoad opl_GeoResource.axd:467
OpenLayers.Layer.Grid.OpenLayers.Class.initGriddedTiles opl_GeoResource.axd:466
OpenLayers.Layer.Grid.OpenLayers.Class.moveTo opl_GeoResource.axd:460
OpenLayers.Layer.OpenLayers.Class.redraw opl_GeoResource.axd:195
OpenLayers.Layer.HTTPRequest.OpenLayers.Class.redraw opl_GeoResource.axd:456
OpenLayers.Layer.OpenLayers.Class.setVisibility opl_GeoResource.axd:197
(anonymous function) VesselTracker.module.js:326
OpenLayers.Events.OpenLayers.Class.triggerEvent opl_GeoResource.axd:137
OpenLayers.Map.OpenLayers.Class.pan opl_GeoResource.axd:168
OpenLayers.Control.DragPan.OpenLayers.Class.panMapDone opl_GeoResource.axd:1117
OpenLayers.Handler.OpenLayers.Class.callback opl_GeoResource.axd:633
OpenLayers.Handler.Drag.OpenLayers.Class.dragend opl_GeoResource.axd:638
OpenLayers.Handler.Drag.OpenLayers.Class.mouseup opl_GeoResource.axd:639
OpenLayers.Events.OpenLayers.Class.triggerEvent opl_GeoResource.axd:137
OpenLayers.Events.OpenLayers.Class.handleBrowserEvent opl_GeoResource.axd:138
(anonymous function)


Hi Johnny, 
  
  
 You are correct and yes I do have the same kind of message than the  one Sindre is getting.  In my case it is first call but I think it could occur latter as well.  I think that I have the issue time to time. 
  
  
 Jm

Hi Guys,


Thank you very much for detailed description, I made a demo attached following Sindre's description using both LayerOverlay and MarkerOverlay, and start the timer for minutes, but seems like things go well. Can you make some changes based on it to reproduce the problem?


Thanks,

Johnny



MvcMapNullException.zip (556 KB)

Hi Johnny, 
  
 I got and try your sample application and it is working fine.  However, we have to compare apple and apple,  in my case the mvc razor map control is way more complex, eg: markers, overlays, layers,…  And not only one many…  Now the issue with map being null when using Ajax to talk with the controller is happening a lot.  I would like to be able to provide you a good example but all of my applications involve background data base and other local services.  If you could tell us what to look for on the JavaScript client side then we could check for map null or something before using the Ajax call?   
  
 Thanks in advance. 
  
 Jm

 Hi Guys,


 
Thanks for all your help. Here are some partial code which can help us for debug:
 
In the packaged function "ajaxCall" in func_GeoResource.axd in runtime, it would be like this:

    ajaxCall: function (url, params, callback) {
        var wRequest = new Sys.Net.WebRequest();
        wRequest.set_url(url);
        wRequest.set_httpVerb('POST');
        var mapParser = this.getMapParser();
        var param = '__#' + mapParser.pageName + "|__#";
        for (var item in params) {
            param = param + item + ":" + params[item] + '^';
        }
        wRequest.set_body(param);
        wRequest.add_completed(callback);
        wRequest.invoke();
    },


 
 
You can see the mapParser.pageName property which actually is the session key as map and it was stored at the first loading. So, I guess the null map might be caused by an empty pageName or the session map is missing on the server. 
 
Besides, we can recreate it but only when the session is time out. so, please confirm the null map is not caused by session time out. Actually, in our Web/Mvc edition, the session should not be timeout as we do a request to server every 15 minutes to keep session alive. You can find the method named “keepsession” in “helper_GeoResouce.axd” file. If the reason is 15 minutes too long, you can add an extra method to reduce the time. Like below is every 1 minute:
 

customKeepSession();
function customKeepSession() {
    window.setInterval(function A() {
        OpenLayers.Request.issue({ url: 'session_GeoResource.axd' });
    }, 60000);
}


 
If possible, please have a try.
Hope you are lucky and look forward to your further information.
 
Thanks
Johnny

Hi, 
  
 Was very busy!!! but I am back now!    
  
 The issue is still alive and I do update the DLLs every day using the daily build.   I can tell for sure that in my case there is no session time out because the issue arise when I load the application first time…  However, I have an application with 3 MVC map control inside the same page and the issue occur for the first map…  then the 2 other maps are just working OK…  the other thing is that when I refresh the page then all maps are correct…   
  
 What is happening when the web page load first time???   why is the map object return to the server side by the Ajax call empty??? 
  
 jm.

Hi Jean-marie, 
  
 I guess we are getting close to each other. Could you let me know how you call the client AjaxCall? Can you show this scripts and the corresponding Action code here? I just tried 3 maps in one view page, it works fine for me, maybe I didn’t put the AjaxCall to the position where you are using. 
  
 Thanks, 
 Johnny

Please let me know when you will have an answer for me.  I have uploaded the sample application on your FTP yesterday afternoon. 
  
 thanks

Hi Jean-marie, 
  
 Thanks for providing the further information, we have created a ticket (9684) for you, please check the anwser there. 
  
 Thanks, 
 Johnny

I found what seems to be the issue with the MAP being null !!!     
  
 I was able to observe that for whatever reason the thinkgeo or openlayers code try to use an object that has been saved previously inside the browser cache…  clearing the browser cache   solve the issue instantly! 
  
 jm