ThinkGeo.com    |     Documentation    |     Premium Support

PageName problem

Hello.


I have:


1 page called MAPVIEWER.ASPX


have a parameter called PROJID


and depending of the PROJID I show on map or other map


for example:


MapViewer.aspx?PROJID=1


MapViewer.aspx?PROJID=2


If I open the first mapviewer, then in a new tab I open second one, then I return to the first and the map went crazy, wrong projection.


I was able to find that you are using a session var made of  PageName and MapControl.ClientID, and that PageName in my case is allways "MapViewer".


Shouldn't you use a GUID for PageName? 



 


Hi Rui,
Just as you have descripted, we use the “PageName” and “ClientID” as the Session id. I think the issue occurs when we try the steps as following:
1.       Create one page which includes two Hyperlinks, one is “MapViewer 1” with the link “MapViewer.aspx?ProjId = 1”, another is “MapViewer2” with the link “MapViewer.aspx?ProjId = 2”.
2.       Click the first link and open the MapViewer1 in self-window, all works fine. And then change the link to “MapViewer.aspx?ProjId = 2”, also it works normally. Maybe we found all the resources are new requested.
3.       After that, change the request link to “MapViewer.aspx?ProjId = 1” and then press the “Enter” key, the map runs into error projection, am I right? If we use the HttpWatch to trace the request log, we may find all are cached except the tile images. It won’t runs into page life-cycle, such as OnInitialize, onLoad, SaveViewState etc. And thus, the map doesn’t update the Session, in other words, the HttpHandler still uses the old map configuration. I think that’s why the error happened.
Thanks for your suggestion, which is used at the beginning and encountered certain problems, we’re gonna dive in to a bit and give you the solution in several days.
Sorry for the inconvenience.
Johnny

Yep, I think that’s it.

 Hi Rui,


It seems like using GUID as the session id is unable to resolve the problem. As far as I know, there are two ways to save session state:
1.       Using GUID as the Session Id, it changes and re-saves the session state for each Postback. Obviously, we are unable to use it, because there will be lots of copies of session, which consumes a huge memory.
2.       Still taking the GUID as the session id to replace the “PageName”+ “Client ID”, but there is only one copy of map configuration. I think It’s also unable to resolve the problem, because the browser has cached the page for second request, it won’t runs into page life-cycle, and of course, we are unable to update the session.
We’re gonna try some other ways. Do you have any idea about it?
Thanks,
Johnny

Maybe I'm not understanding the problem since I don't have the code, but...



Pagename is a property in Map control, can it be saved and retrieved to/from viewstate?



And for overlay request you are passing the pagename in the querystring, right?



somthing like:




public String Pagename {

get{


if(viewstate["pagename"] == null)


viewstate["pagename"] = guid.newguid.tostring();


return viewstate["pagename"];


}


set{


viewstate["pagename"] = value;


}

}


(the upper code was made here in reply editor)


 


I don't know if it works, but I guess it does. 


At the moment you don't have the setter in the property, the property is readonly, so we can't force the pagename in runtime. If it was read/write maybe I could manage myself. 



Hi Rui, 
  
 Yes, Pagename is the name of the page which uses the map control, also is the property of map control. It can be saved and retrieved to/from ViewState. It’s also contained in querystring. But the problem isn’t what the session ID should be, “Pagename + clientID” or GUID. The problem is that the Page is cached and it won’t run into page life-cycle, thus, it’s unable to update the content of session.  
  
 Thanks for your ideas a lot. 
 Johnny 


I think you don't need the PageName + ClientID, but even so, you may keep it. In my opinion you should just change the PageName property to something like I told. 


But you could just make a simple test:


1.put the PageName property writable


2. create a page with the map control


3. In Page_load add: if(!Page.IsPostback) this.map1.PageName="thisIsMyPageName";


4. see what happens.


(or send me a compiled version with this property writable and I'll give it a try)


Now, one other point just to see if I'm understanding, if we have:



    public class ServerControl1 : WebControl
    {
        private Object _something;

        public String MapControlSessionIdentifier
        {
            get {
                if(ViewState["MapControlSessionIdentifier"] == null)
                    ViewState["MapControlSessionIdentifier"] = Guid.NewGuid().ToString().Replace("-", "");
                return (String)ViewState["MapControlSessionIdentifier"];
            }
            set {
                ViewState["MapControlSessionIdentifier"] = value;
            }
        }

        protected override object SaveViewState()
        {
            HttpContext.Current.Session[this.MapControlSessionIdentifier + "something"] = _something;
            return base.SaveViewState();
        }
        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);
            _something = HttpContext.Current.Session[this.MapControlSessionIdentifier + "something"];
        }
    }

Won't this work?


Once again for you not to change to much code logic (C# and JavaScript), I think that you should stick with the PageName + ClientId approach, but just make the PageName more independent (or even writable).


What you say?


 



Rui,


Thanks for providing your ideas, I think I need to write a very simple custom control to stimulate the problem and try various solutions, of course including the one that you gave. Please keep this thread alive and we will follow up.
Thanks,
Johnny

Hello Johnny. Any news on this topic?

Hello Rui, 
  
 We are still on the road, I think the next week Johnny will give you a detail reply. 
  
 Thanks 
  
 James

OK

Hi Rui, 



Sorry for the delay, I was on vacation last week, and I have to focus on something with high priority primarily. Please allow us to give the answer tomorrow morning. Sorry for the inconvenience. 



Thanks, 

Johnny 

 



Hi Rui,


Sorry for the delay. After creating a simple control and a demo following your description, finally, I think we find the problem. Please get these projects from attachments. We shouldn’t worry about using PageName+ClientID as the session id, as far as we tested, it just happened in IE, because the Firefox, Chrome will cache the images if each request has the same URL, but IE doesn’t, it requires some special settings. Here as following is the code that we need to set for Overlay:
Map1.StaticOverlay.ClientCache = new ThinkGeo.MapSuite.WebEdition.ClientCache(TimeSpan.FromSeconds(100), "StaticOverlayCacheId");
 
If we trace the requests using HttpWatch, we will see that the IE just cache the page and httphandlers (.axd), but doesn’t cache the images, that’s why the issue happened.
Any questions please let us know. Thanks,
Johnny

Post8533.zip (133 KB)
SimpleMap.zip (134 KB)

Hi Johnny, I'm almost 100% sure that the problem is with session var name using the PageName and this being ASPX file name.


Please see this video to better understand my problem: hotfile.com/dl/94687275/0952846/My_Movie.wmv.html


If I could do something in your code like: Map1.PageName = "Mypage" + projID, I'm almost sure that the problem would be solved.



 


Rui,
Thanks for the video which makes me know what exact problem is. I thought we misunderstood each other before. Honestly, that’s a bug, i think your idea indeed makes sense, but maybe it’s weird that PageName can be set. Someone maybe is curious that the name is given by the name of the .aspx file, why it can be changed in runtime. Now we are thinking about using URL instead of PageName, but still needs research and tests. Sorry for the inconvenience.
Thanks,
Johnny

Yes I agree with you when you say it’s weird that PageName can be set, but I only said that so we could understand if this would fix the things. 
  
 Changing to full URL will you not have problems with MVC? Or you don’t support MVC at all?

 


Rui,
Thanks for the reminder and sorry for the delay. I think it’s hard to get a solution which works pretty well in any scenario in a short time. I have submitted it to our issue list and hope there is a better way to resolve it in the future.
Just as we have mentioned, currently, we used the “PageName + ClientID” as the root of the session id. In other words, to get around of this issue, we can overwrite the ClientID raster than changing PageName, am I right? We also tried this way and it helped.
Any questions please let us know. Thanks,
Johnny

Yes I think that should help. But are we able to do that now?  
 Can you, please, supply an example ?

Rui,


Here it is. The overwrite map can be found in  CustomMap.cs file.


Thanks,


Johnny



001_Post8533.zip (131 KB)

I was not able to execute the example.  
 Do I need any specific version?