如何使用C#app在本地保存cookie?

时间:2015-06-11 15:28:13

标签: c# cookies

我有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:

2 个答案:

答案 0 :(得分:3)

任何应用程序都可以为浏览器编写cookie,但它会引入应该考虑的问题。

  • 首先是兼容性,而不是任何人使用相同的浏览器和相同的系统。将cookie从应用程序传输到用户的浏览器将是一个难以维护的地方。

  • 接下来,浏览器处理cookie的方式的任何更新都会破坏您的代码,并且您最终也可能会破坏浏览器。 即使你只是想为IE创建一个cookie,用户也有不同的版本。

  • 文件锁定,如果浏览器使用 cookie文件,您可能无权在其上书写

  • 用户覆盖,如果用户已通过浏览器登录,则为其他用户创建cookie只会断开初始用户的连接。

但要回答如何,IE提供了WinINet APIs,您可以使用InternetSetCookieInternetSetCookieEx

对于使用这些方法的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。