WinRT WebView and Cookies
- by javarg
Turns out that WebView Control in WinRT is much more limited than it’s counterpart in WPF/Silverlight. There are some great articles out there in how to extend the control in order for it to support navigation events and some other features. For a personal project I'm working on, I needed to grab cookies a Web Site generated for the user. Basically, after a user authenticated to a Web Site I needed to get the authentication cookies and generate some extra requests on her behalf. In order to do so, I’ve found this great article about a similar case using SharePoint and Azure ACS. The secret is to use a p/invoke to native InternetGetCookieEx to get cookies for the current URL displayed in the WebView control. void WebView_LoadCompleted(object sender, NavigationEventArgs e)
{
var urlPattern = "http://someserver.com/somefolder";
if (e.Uri.ToString().StartsWith(urlPattern))
{
var cookies = InternetGetCookieEx(e.Uri.ToString());
// Do something with the cookies
}
}
static string InternetGetCookieEx(string url)
{
uint sizeInBytes = 0;
// Gets capacity length first
InternetGetCookieEx(url, null, null, ref sizeInBytes, INTERNET_COOKIE_HTTPONLY, IntPtr.Zero);
uint bufferCapacityInChars = (uint)Encoding.Unicode.GetMaxCharCount((int)sizeInBytes);
// Now get cookie data
var cookieData = new StringBuilder((int)bufferCapacityInChars);
InternetGetCookieEx(url, null, cookieData, ref bufferCapacityInChars, INTERNET_COOKIE_HTTPONLY, IntPtr.Zero);
return cookieData.ToString();
}
Function import using p/invoke follows:
const int INTERNET_COOKIE_HTTPONLY = 0x00002000;
[DllImport("wininet.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref System.UInt32 pcchCookieData, int dwFlags, IntPtr lpReserved);
Enjoy!