我有一个应用程序,它使用Webbrowser控件导航到一些供应商站点并抓取报告。因为有一个供应商有多个帐户,我需要让浏览器结束其会话并清除任何设置的cookie。我正在对两者使用wininet.dll的API调用,并且能够实现所需的结果。但是,间歇性地,我在INTERNET_OPTION_END_BROWSER_SESSION的InternetSetOption上看到了似乎是死锁。
它是非常线性的代码,InternetSetOption在一个地方从一个线程调用。让人难以理解的是,在调试中运行时,我很少能够重现问题。只要我在VS之外编译并运行,它就会在不久之后发生。我通过在运行时将消息泵送到控制台来将其隔离。
我几次能够在调试时发现问题,它只是将InternetSetOption显示为下一个语句并且没有异常或错误,输出窗口中没有任何内容。 InternetSetOption应该返回布尔值,但程序将不再进一步,我永远不会从API调用返回任何内容。我试着查看抛出的最后一条错误消息,但在这种情况下它没有帮助,因为它从不会抛出错误。
任何人都有任何关于我可以进一步调试此操作的输入吗?
声明为:
[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool InternetSetOption(
IntPtr hInternet,
int dwOption,
IntPtr lpBuffer,
int lpdwBufferLength);
并呼吁:
InternetSetOption(IntPtr.Zero, 42, IntPtr.Zero, 0);
答案 0 :(得分:2)
对于遇到这种情况并且偶然遇到同样问题的人来说,问题似乎是由我在MSDN网站上找到的用于清除缓存和Cookie的功能引起的。 found here
ClearCache()函数有几个问题,一个在x86和x64之间,以及它如何引用缓存文件来删除它们 -
在当前函数中,它会像这样调用DeleteUrlCacheEntry:
DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName);
但是,x64应该是
DeleteUrlCacheEntry(internetCacheEntry.lpszLocalFileName);
您必须在基于平台的那些之间切换,单个引用在x64和x86上都不起作用。然而,对我而言,模仿点。这个函数经常抛出访问冲突异常,即使被捕获和处理,我相信这是InternetSetOption执行看起来像死锁的根源。再次,由于死锁的奇怪性质,我永远无法彻底解决它,因为我使用了ClearCache()函数和InternetSetOption。更改两个函数调用的顺序并没有纠正它。
我删除了WebBrowserHelper类,然后通过执行RunDLL32并等待该进程退出来恢复缓存和cookie。
希望能帮助别人!