Как очистить текущие данные сеанса (файлы cookie, кешированные данные, сеансы аутентификации и т.д.) без перезапуска приложения?
Обновление: я говорю об управлении WebBrowser в Windows.Forms, а не в сессии ASP.Net.
Как очистить текущие данные сеанса (файлы cookie, кешированные данные, сеансы аутентификации и т.д.) без перезапуска приложения?
Обновление: я говорю об управлении WebBrowser в Windows.Forms, а не в сессии ASP.Net.
Чтобы очистить сеанс (например, файлы cookie HttpOnly), вы можете использовать InternetSetOption() из wininet.dll.
private const int INTERNET_OPTION_END_BROWSER_SESSION = 42;
[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);
и использовать этот метод, когда необходимо очистить сеанс.
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0);
webBrowser1.Document.Window.Navigate(url);
Если у вас включен javascript, вы можете просто использовать этот фрагмент кода для очистки, чтобы очистить файлы cookie для сайта, на котором сейчас работает веб-браузер (я еще не нашел способ очистить сеансовые файлы cookie, кроме этого).
webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")
Он извлекает из этот букмарклет для очистки куки файлов.
В дополнение к этому вы можете удалить содержимое папки `` C:\Documents and Settings\username\Cookies '' (минус index.dat, который обычно заблокирован).
Что касается кэшированных данных, должно быть достаточно просто удалить все файлы в `` C:\Documents and Settings\username\Local Settings\Temporary Internet Files ''.
Если вам действительно нужно очистить файлы cookie для всех сайтов, вам, вероятно, лучше использовать что-то вроде управления axWebBrowser в конечном итоге.
Я попробовал все, чтобы очистить данные формы, чтобы следующий пользователь не увидел предыдущий адрес электронной почты и т.д. Я закончил это, чтобы очистить файлы cookie...
string[] theCookies = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Cookies));
foreach (string currentFile in theCookies)
{
try
{
System.IO.File.Delete(currentFile);
}
catch (Exception ex)
{
}
}
webBrowser1.Document.Cookies = "" не будет работать. Этот вызов не очистит файл cookie. webBrowser1.Document.Cookies = просто работает как document.cookie в javascript. Вы должны найти cookie, который хотите очистить, sa 'Session', использовать webBrowser1.Document.Cookies = "Session = ''"; Он просто установит файл cookie '', как вы хотите.
Следующее решение сработало для меня -
webBrowser1.Document.ExecCommand("ClearAuthenticationCache", false, null);
Это было предложено в следующем сообщении для удаления файлов cookie - fooobar.com/questions/212436/...
Вы можете найти дополнительную информацию об этом здесь - https://msdn.microsoft.com/en-us/library/system.windows.forms.htmldocument.execcommand(v=vs.110).aspx
Надеюсь, это поможет!!!
Private Const INTERNET_OPTION_END_BROWSER_SESSION As Integer = 42
<DllImport("wininet.dll", SetLastError:=True)>
Public Shared Function InternetSetOption(hInternet As IntPtr, dwOption As Integer, lpBuffer As IntPtr, lpdwBufferLength As Integer) As Boolean
End Function
Private Sub WebBrowserFormName_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Closed
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0)
End Sub
Просто опубликуйте для кого-то, кто ищет этот ответ в VB. Счастливое кодирование!!!
Вы должны понимать, что способ отслеживания состояния сеанса с точки зрения веб-сервера заключается в предоставлении клиенту браузера файла cookie с идентификатором сеанса. Когда браузер отправляется обратно на сервер, этот файл cookie позволяет серверу связывать запрос с сохраненным состоянием сеанса.
Таким образом, решение заключается в очистке файлов cookie элемента управления webBrowser. Например webBrowser1.Document.Cookies = "", который должен работать, я думаю.
ASP.NET также имеет то, что он называет "cookieless session", которые работают, добавляя идентификатор сеанса к URL-адресу. Поэтому, если этот механизм используется сервером, вы можете попытаться отфильтровать это из URL-адреса. Но вы не увидите этого, это в основном состояние сеанса на основе файлов cookie.
Windows 7 использует файлы index.dat для хранения файлов cookie и истории, чтобы Билл и его друзья в Центре ЦРУ могли следить за вами и сделали все возможное, чтобы вы не могли удалить эти файлы, и после получения копий, потому что "Специальный Folders 'используются, и файлы .Dat остаются заблокированными во время работы Windows.
Это не идеальное решение, но оно в какой-то степени работает с полными именами файлов, которые находятся в списке.
int DeletedCount = 0;
int CouldNotDelete = 0;
KillExplorer();
foreach (string DatFile in DatFiles)
{//Do not put break point or step into the code else explorer will start and the file will become locked again
DirectoryInfo DInfo=new DirectoryInfo(DatFile.Replace("index.dat",""));
FileAttributes OldDirAttrib = DInfo.Attributes;
DInfo.Attributes = FileAttributes.Normal;//Set to normal else can not delete
FileInfo FInfo = new FileInfo(DatFile);
FileAttributes OldFileAttrib = FInfo.Attributes;
SetAttr(FInfo, FileAttributes.Normal);
TryDelete(FInfo);
SetAttr(FInfo, OldFileAttrib);//Sets back to Hidden,system,directory,notcontentindexed
if (File.Exists(DatFile))
CouldNotDelete++;
else
DeletedCount++;
}
if (DatFiles.Count>0)//Lets get explorer running again
System.Diagnostics.Process.Start(DatFiles[DatFiles.Count - 1].Replace("index.dat", ""));
else
System.Diagnostics.Process.Start("explorer");
System.Windows.Forms.MessageBox.Show("Deleted " + DeletedCount + " Index.dat files with " + CouldNotDelete + " Errors");
return "Deleted " + DeleteFileCount + " Files ";
}
private void KillExplorer()
{
foreach (Process P in Process.GetProcesses())
{//Kill both these process because these are the ones locking the files
if (P.ProcessName.ToLower() == "explorer")
P.Kill();
if (P.ProcessName.ToLower() == "iexplore")
P.Kill();
}
}
private bool TryDelete(FileInfo Info)
{
try
{
Info.Delete();
return true;
}
catch
{return false;}
}
private void SetAttr(FileInfo Info,FileAttributes Attr)
{
try
{
Info.Attributes = Attr;
}
catch { }
}