我将身份验证cookie存储到我的应用程序中的staic CookieContainer中,这要归功于link (1)
上的答案我实现了代码以在DocumentCompleted
事件上获取CookieContainer:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (!this.webBrowser1.Document.Title.Replace(" ", string.Empty).ToLower().Contains("xxx"))
{
CookieContainer ck = GetUriCookieContainer(this.webBrowser1.Url);
validSession = ck;
Succeeded = true;
this.Close();
}
}
因为我正在使用WebClient
,所以我需要创建它的扩展名,以便它可以存储CookieContainer:
public class WebClientEx : WebClient
{
public WebClientEx()
: this(new CookieContainer())
{ }
public WebClientEx(CookieContainer c)
{
this.CookieContainer = c;
}
public CookieContainer CookieContainer { get; set; }
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
var castRequest = request as HttpWebRequest;
if (castRequest != null)
{
castRequest.CookieContainer = this.CookieContainer;
}
return request;
}
}
从(1)存储CookieContainer后,我可以在不进行身份验证的情况下请求页面的任何内容:
WebClientEx e = new WebClientEx(validSession);
string x = e.UploadString(new Uri("http://localhost:14590/default.aspx"), "ola");
// x now contains the html page of default.aspx
问题是当我尝试使用UploadFileAsync
将文件上传到服务器时,我会尝试逐步描述问题:
WebBrowser
控件UploadFileAsync
方法UploadFileCompleted
事件的结果(e.result)是登录页面的html内容,这意味着我在WebClient中传递的CookieContainer不起作用。 但是请看一下这些步骤,上传功能可以顺利运行:
UploadFileAsync
方法上传文件 - >成功我无法理解为什么会这样?你有什么想法吗?请注意,如果我使用其他方法,如WebClient.UploadString(),如果cookieContainer可用,则不会重定向回登录页面。
答案 0 :(得分:0)
由于一些未知的原因,CookieContainer导致了这个问题,在看完提琴手之后,我意识到从webclient
到服务器的第一次调用不包含任何cookie,所以我摆脱了CookieContainer并将其替换为此:
WebClient e = new WebClient();
e.Headers.Add(HttpRequestHeader.Cookie, "cookies I get from webbrowser control");
瞧,一切都很好!