我有c#代码向特定域发出请求并获取响应cookie。
现在,当我在Internet Explorer中访问相同的网址时,系统会提示我输入凭据,因为我的应用获得的Cookie似乎并未保存在“Internet临时文件”中。像常规cookie一样存储的文件夹。
那么即使我的本地c#app关闭,我如何通过IE存储cookie以供将来使用?
我在response.cookies中获得了有效的Cookie。
[已添加更多信息]
Internet Explorer 8 Visual Studio 2010 Windows 7 64位
以下是我对InternetSetCookieEx的调用
我正在做的是在请求中使用Cookie1转到URL1,我在响应中获得了更多cookie,用于验证URL2,URL2接收cookie并发送更多cookie。现在从webbrowser控件发送一个单独的URL2调用,当在Fiddler上看到它似乎没有携带我从response2获得的cookie。
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
public static extern bool InternetSetCookieEx(string UrlName, string CookieName, string CookieData);
URL1 = "my.domain.com/page1.aspx";
URL2 = "my.domain.com/page2.aspx";
// Request to URL1
HttpWebRequest request1 = HttpWebRequest.Create(URL1) as HttpWebRequest;
request1.Method = "GET";
request1.Accept = "*/*";
request1.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
request1.UserAgent = "CookieCreator";
request1.KeepAlive = true;
request1.AllowAutoRedirect = true;
Uri uri1 = new Uri(URL1);
request1.CookieContainer = new CookieContainer();
request1.CookieContainer.Add(new Cookie() { Name = "Cookie1", Value = "Some Value", Domain = uri1.Host });
HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse();
//Request to URL2
HttpWebRequest request2 = HttpWebRequest.Create(URL2) as HttpWebRequest;
request2.Method = "GET";
request2.Accept = "application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
request2.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
request2.UserAgent = "CookieCreator";
request2.KeepAlive = true;
request2.AllowAutoRedirect = true;
Uri uri = new Uri(URL2);
request2.CookieContainer = new CookieContainer();
//This sets session cookies, also adds the response cookie from URl1 into the request for URL2
foreach (Cookie cookie1 in response1.Cookies)
{
bool Output = InternetSetCookieEx(URL1, cookie1.Name, cookie1.Value);
request2.CookieContainer.Add(cookie1);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//This sets session cookies, hence will/should not be prompted for login credentials
foreach (Cookie cookie2 in response2.Cookies)
{
bool Output = InternetSetCookieEx(URL2, cookie.Name, cookie.Value);
}
我使用
时出现异常bool Output = InternetSetCookieEx(URL1, cookie.Name, cookie.Value, "INTERNET_COOKIE_THIRD_PARTY");
异常
System.AccessViolationException未被用户代码
处理 HResult = -2147467261 Message =尝试读取或写入受保护 记忆。这通常表明其他记忆已损坏 Source = Thomson.Reuters.AFO.Components.Excel StackTrace: at Thomson.Reuters.AFO.Components.Excel.DFOCookieValidator.DFOCookieValidator.InternetSetCookieEx(String UrlName,String CookieName,String CookieData,String flag) 在Thomson.Reuters.AFO.Components.Excel.DFOCookieValidator.DFOCookieValidator.ChartingCookieValidation(String 网址) C:\代码库\ DFO \ AFO \ Thomson.Reuters.AFO.Components.Excel \ DFOCookieValidator \ DFOCookieValidator.cs:行 180 at Thomson.Reuters.AFO.Components.Excel.AFOBrowser.AFOBrowserNewWindow.webBrowserNewWindow_Navigating(Object 发件人,NavigatingCancelEventArgs e)in C:\代码库\ DFO \ AFO \ Thomson.Reuters.AFO.Components.Excel \ AFOBrowser \ AFOBrowserNewWindow.xaml.cs:行 139 在System.Windows.Controls.WebBrowser.OnNavigating(NavigatingCancelEventArgs) E) 在MS.Internal.Controls.WebBrowserEvent.BeforeNavigate2(Object pDisp,Object& url,Object& flags,Object& targetFrameName,Object& postData,Object&标题,布尔&取消)InnerException:
答案 0 :(得分:3)
任何应用程序都可以为浏览器编写cookie,但它会引入应该考虑的问题。
首先是兼容性,而不是任何人使用相同的浏览器和相同的系统。将cookie从应用程序传输到用户的浏览器将是一个难以维护的地方。
接下来,浏览器处理cookie的方式的任何更新都会破坏您的代码,并且您最终也可能会破坏浏览器。 即使你只是想为IE创建一个cookie,用户也有不同的版本。
文件锁定,如果浏览器使用 cookie文件,您可能无权在其上书写
用户覆盖,如果用户已通过浏览器登录,则为其他用户创建cookie只会断开初始用户的连接。
但要回答如何,IE提供了WinINet APIs,您可以使用InternetSetCookie或InternetSetCookieEx
对于使用这些方法的IE,这将是最干净的方式。
在Windows Vista及更高版本上,Internet Explorer在保护模式下运行Internet内容,这是一个带有隔离cookie存储的沙箱。要从运行中等完整性(也称为Internet Explorer之外)的外部应用程序在保护模式沙箱中设置cookie,您必须使用IESetProtectedModeCookie功能。
Windows 8+上的E10 +引入了增强保护模式,该模式使用AppContainers(而不是Integrity Levels)进行隔离。 EPM不提供与cookie交互的API; IESetProtectedModeCookie不会在AppContainer中设置cookie。 (source)
但是,再一次,更愿意让用户重新振作起来。
答案 1 :(得分:0)
显然它是我生成的会话cookie,它不会存储在IE cookie商店中。因此,对同一域/ URL的任何新HTTP请求都不会包含任何cookie。
所以我所做的是创建了一个新的webbrowsercontrol,隐藏了可见性,然后导航到该URL。我现在已经存储在IE cookie商店中的会话cookie。