【问题标题】:Very strange behaviour with WebClient.UploadFileASyncWebClient.UploadFileASync 的行为非常奇怪
【发布时间】:2016-03-13 02:59:05
【问题描述】:

感谢link 上的回答,我将身份验证 cookie 存储到我的应用程序中的静态 CookieContainer 中(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 将文件上传到服务器时,我将尝试逐步描述问题:

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

但是请看这些步骤,上传功能不会有问题:

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

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

【问题讨论】:

    标签: c# asp.net cookies webclient


    【解决方案1】:

    不知道什么原因,是CookieContainer导致了这个问题,看了fiddler后发现webclient第一次调用服务器没有cookie,所以我把CookieContainer去掉,换成这个:

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

    瞧,一切都很好!

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2020-02-09
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      相关资源
      最近更新 更多