我有C#代码,它向特定域发出请求并获取响应Cookie。

现在,当我在Internet Explorer中转到相同的URL时,系统会提示我输入凭据,因为我的应用获得的cookie似乎不像常规cookie的存储方式一样保存在“ Temporary Internet Files”文件夹中。

那么,即使我的本地c#应用程序已关闭,我如何存储cookie以便通过IE将来使用?

我的response.cookies中确实获得了有效的cookie。

[添加更多信息]

Internet Explorer 8
Visual Studio 2010
Windows 7 64位

这是我给InternetSetCookieEx的电话

我正在做的是在请求中将Cookie1发送到URL1,我在响应中获得了更多的cookie,这些URL是身份验证URL2所必需的,URL2接收了cookie并发送了更多cookie。现在,从Web浏览器控件发送了对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消息=试图读取或写入受保护
  记忆。这通常表明其他内存已损坏。
  来源= Thomson.Reuters.AFO.Components.Excel StackTrace:
         在Thomson.Reuters.AFO.Components.Excel.DFOCookieValidator.DFOCookieValidator.InternetSetCookieEx(String
  UrlName,字符串CookieName,字符串CookieData,字符串标志)
         在Thomson.Reuters.AFO.Components.Excel.DFOCookieValidator.DFOCookieValidator.ChartingCookieValidation(String
  URL)
  C:\ Codebase \ DFO \ AFO \ Thomson.Reuters.AFO.Components.Excel \ DFOCookieValidator \ DFOCookieValidator.cs:line
  180
         在Thomson.Reuters.AFO.Components.Excel.AFOBrowser.AFOBrowserNewWindow.webBrowserNewWindow_Navigating(Object
  发送者,NavigatingCancelEventArgs e)在
  C:\ Codebase \ DFO \ AFO \ Thomson.Reuters.AFO.Components.Excel \ AFOBrowser \ AFOBrowserNewWindow.xaml.cs:line
  139
         在System.Windows.Controls.WebBrowser.OnNavigating(NavigatingCancelEventArgs
  e)
         在MS.Internal.Controls.WebBrowserEvent.BeforeNavigate2(Object pDisp,Object&url,Object&标志,Object&targetFrameName,Object&
  postData,Object&标头,Boolean&取消)InnerException:

最佳答案

任何应用程序都可以为浏览器编写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(而不是完整性级别)进行隔离。 EPM不提供与Cookie交互的API; IESetProtectedModeCookie不会在AppContainer中设置cookie。 (source)


但是同样,更喜欢让用户重新登录自己。

关于c# - 如何使用C#应用程序在本地保存Cookie?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30785108/

10-11 06:00