WebClient.UploadFileASync非常奇怪的行为

时间:2015-12-08 08:59:40

标签: c# asp.net cookies webclient

我将身份验证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将文件上传到服务器时,我会尝试逐步描述问题:

  • 打开应用程序
  • 打开登录表单(默认网址将导航至default.aspx页面)
  • 使用WebBrowser控件
  • 登录网站
  • webBrowser将导航至default.aspx页面
  • 存储Cookie
  • 使用UploadFileAsync方法
  • 上传文件
  • UploadFileCompleted事件的结果(e.result)是登录页面的html内容,这意味着我在WebClient中传递的CookieContainer不起作用。

但是请看一下这些步骤,上传功能可以顺利运行:

  • 打开应用程序
  • 打开登录表单(默认网址将导航至default.aspx页面)
  • webBrowser将导航至default.aspx页面
  • 存储Cookie
  • 打开登录表单,现在webBrowser将直接导航到default.aspx,因为经过身份验证的会话仍然可用。
  • 使用UploadFileAsync方法上传文件 - >成功
  • 我确信我在第一次登录尝试时获得的CookieContainer是正确的,因为我可以使用WebClient.UploadString()或任何HttpWebRequest来使用它,顺便说一下我检查了CookieContainer第二次尝试,它与第一次相同。

我无法理解为什么会这样?你有什么想法吗?请注意,如果我使用其他方法,如WebClient.UploadString(),如果cookieContainer可用,则不会重定向回登录页面。

1 个答案:

答案 0 :(得分:0)

由于一些未知的原因,CookieContainer导致了这个问题,在看完提琴手之后,我意识到从webclient到服务器的第一次调用不包含任何cookie,所以我摆脱了CookieContainer并将其替换为此:

    WebClient e = new WebClient();
    e.Headers.Add(HttpRequestHeader.Cookie, "cookies I get from webbrowser control");

瞧,一切都很好!