ThinkGeo.com    |     Documentation    |     Premium Support

WmsOverlay : Add a cookie within the WmsRequest

Hello,


I know it is no standard feature of Wms, but is there a way to configure the WmsOvelay to send a cookie with the MapRequest when using WmsOverlay ?


I don't mean to add a additional uri parameter, but really a small cookie file in the request, that can be read by a custom code in the Wms Server. (it could be to send some kind of authentification cookie with the map requests)


Even if I need to inherit the WmsOverlay and to write custom code, is it possible to do such a thing ? And if yes, how ?


Thanks for your answer,

Guillaume.


 



Hi Guillaume,



It’s possible to implement this feature by inheriting from WmsOverlay and its UriTile. But I’m not sure why you want to do like this. If you are considering the authority, we can simply use parameters in the Uri to implement this. For example we can send a client id and an encrypted key within the Uri parameters; on the Wms server, we can check if this request is valid. Maybe there is a better way if you let us know your exactly requirement.



On the other hand, I enhanced the API so that you can easily override the WmsOverlay to satisfy your requirement with the latest build 4.0.63.0; please see the following code.

public class CookiedWmsOverlay : WmsOverlay
{
    protected override ThinkGeo.MapSuite.WpfDesktopEdition.Tile GetTileCore()
    {
        return new CookiedUriTile();
    }
}

public class CookiedUriTile : UriTile
{
    protected override System.Drawing.Bitmap GetBitmapCore(UriTileArguments args)
    {
        HttpWebResponse response = null;
        Bitmap bitmap = null;

        try
        {
            Cookie cookie = new Cookie();
            cookie.Domain = "localhost:55885";
            cookie.Name = "Name";
            cookie.Value = "ThinkGeo";

            CookieContainer cookieContainer = new CookieContainer();
            cookieContainer.Add(cookie);

            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(args.Uri);
            request.Proxy = args.WebProxy;
            request.CookieContainer = cookieContainer;

            response = (HttpWebResponse)request.GetResponse();
            bitmap = new Bitmap(response.GetResponseStream());

            return bitmap;
        }
        finally
        {
            if (response != null) { response.Close(); }
        }
    }
}



Support@thinkgeo.com will start to work tomorrow and I think you can try it tomorrow; thanks for your understanding.



Thanks,

Howard



Hello Howard, 
  
 I recieved the dlls from the support, but the files are only version 4.0.59.0, and with this version there is no GetBitmapCore() method to override in the UriTile class. I will write them that they didn’t send me the right package. 
  
 The goal is to make an authentification on the server, but we don’t want the authentification informations to be passed in the URL. 
 One possibility was to send a cookie with each request. 
  
 For now we are testing Windows Authentification too. I saw that there is a Credentials properties in the WmsLayer, but I could find it on the WmsOverlay class. Does it exists ? How can I configure the WmsOverlay to use window identity in order to connect the WmsServer ? 
  
 If it does not exists, one possibility for us is to create a custom HttpWebRequest and set the CredentialCache in it. For that I think the code you send me is good, but I cannot test it yet. I’ll wait to recieve the right version (4.0.63.0) from the support. 
  
 Guillaume.

Guillaume, 
  
 Yes, they didn’t send you the right version. Please check the download list, I think you can download the latest version from there too. The WmsOverlay doesn’t support setting the credentials property because it requests images by get method from the merged uri directly. But acutally as you said, you can implement this feature by rewriting the GetBitmapCore method. Hope it makes sense and feel free to let me know if you have more queries. 
  
 Thanks, 
 Howard

Hi Howard, 
  
 Thank you, I could download the right version from the download list, and I could overrride the GetBitmapCore method. 
 It works good. 
  
 Many thanks for your time, 
 Guillaume.

Hi Guillaume, 
  
 You are so welcome; feel free to let me know if you have more queries. 
  
 Thanks, 
 Howard