我有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,您可以使用InternetSetCookie或InternetSetCookieEx
对于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/