1

我使用此代码登录和下载所需文件大约半年,现在它已经开始抛出异常参数'{0}'不能是空字符串。参数名称:cookie.Domain,我查了google,这是一个流行的问题,但我不明白为什么?以前一切都很好,我没有更改任何程序代码,但是在 railwagon cookie 中可以更改什么,所以我的程序现在无法理解它们?

        CookieContainer cookies = new CookieContainer();
        CookieAwareWebClient http = new CookieAwareWebClient(cookies);

        string sLogin = "name=_______&password=_______&dobav2_login=_______";
        http.Headers["Content-type"] = "application/x-www-form-urlencoded";
        http.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";

        string sResponse = http.UploadString("https://www.railwagonlocation.com/en/index.php", sLogin);
        richTextBox1.Text = sResponse;


        http.DownloadFile("https://www.railwagonlocation.com/export_excel.php?export_type=vagon_list&l=en", "D:\\my_excel.xlsx");

感知客户端

 public class CookieAwareWebClient : WebClient
    {
    public CookieContainer CookieContainer { get; set; }
    public Uri Uri { get; set; }

    public CookieAwareWebClient()
        : this(new CookieContainer())
    {
    }

    public CookieAwareWebClient(CookieContainer cookies)
    {
        this.CookieContainer = cookies;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = this.CookieContainer;
        }
        HttpWebRequest httpRequest = (HttpWebRequest)request;
        httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        return httpRequest;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
        String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];

        if (setCookieHeader != null)
        {
            //do something if needed to parse out the cookie.
            if (setCookieHeader != null)
            {
                Cookie cookie = new Cookie(); //create cookie
                this.CookieContainer.Add(cookie);
            }
        }
        return response;
    }
}

在线错误

  this.CookieContainer.Add(cookie);

还有我们如何在这里有cookie.Domain参数

                Cookie cookie = new Cookie(); //create cookie
                this.CookieContainer.Add(cookie);

如果我们刚刚创建了新的 cookie?

4

1 回答 1

1

好吧,您所做的只是创建一个空 cookie,您没有设置域、名称或值,这就是 CookieContainer 在您尝试添加它时检查的内容。因此,一种解决方案是为该 cookie 设置值。但是,由于您已经在 GetRequest 覆盖中引用了 CookieContainer,因此您无需对通过 Response 获得的 Set-Cookie Header 执行任何操作,因此 CookieContainer 应该已经添加了这些 cookie。

于 2013-06-08T20:53:37.640 回答