Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否接受WebClient中的Cookie?_C#_Html_Cookies_Webclient - Fatal编程技术网

C# 是否接受WebClient中的Cookie?

C# 是否接受WebClient中的Cookie?,c#,html,cookies,webclient,C#,Html,Cookies,Webclient,我刚开始尝试使用C#WebClient。我所拥有的是下面的代码,它从网站获取html代码并将其写入.txt文件。我唯一的问题是,有些网站要求你在使用网站之前接受cookies。这导致的不是将真正的网站html代码写入.txt文件,而是写入cookie弹出式html代码 代码: 那么解决这个问题的办法是什么呢?有人能告诉我正确的路线吗?这可能与 我上面提到的问题是针对VB.NET的,但是对于C#的机制应该是相同的。我怀疑您看到的行为是网站发送cookie,然后请求返回,但您的客户端没有设置为将co

我刚开始尝试使用C#
WebClient
。我所拥有的是下面的代码,它从网站获取html代码并将其写入.txt文件。我唯一的问题是,有些网站要求你在使用网站之前接受cookies。这导致的不是将真正的网站html代码写入.txt文件,而是写入cookie弹出式html代码

代码:


那么解决这个问题的办法是什么呢?有人能告诉我正确的路线吗?

这可能与

我上面提到的问题是针对VB.NET的,但是对于C#的机制应该是相同的。我怀疑您看到的行为是网站发送cookie,然后请求返回,但您的客户端没有设置为将cookie返回到服务器,因此它将此解释为您“不接受cookie”

您是否使用了Fiddler之类的分析工具来分析与客户沟通的内容

您可能还需要发送一个特定的HTTP头来表示您接受cookies,但我不记得在我过去的经验中需要这样做。

用法:

        CookieContainer cookieJar = new CookieContainer();
        cookieJar.Add(new Cookie("my_cookie", "cookie_value", "/", "mysite"));

        CookieAwareWebClient client = new CookieAwareWebClient(cookieJar);

        string response = client.DownloadString("http://example.com/response_with_cookie_only.php");


您将看到GetWebRequest和GetWebResponse的两个重写方法。可以重写这些方法来处理cookie容器。

只需将标题中的cookie字符串存储到本地会话\u cookie字符串中即可

if (System.Web.HttpContext.Current.Session["cookie"] != null)
            _cookies = System.Web.HttpContext.Current.Session["cookie"].ToString(); 

     using (WebClient wc =  new WebClient())
        {

            wc.Headers.Add("Cookie", _cookies);
             string HtmlResult = wc.UploadString(bridge_url, myParameters);
            _cookies = wc.ResponseHeaders["Set-Cookie"];
            Debug.WriteLine("Headers" + _cookies); 

            System.Web.HttpContext.Current.Session["cookie"] = _cookies;

        } 

在这种特殊情况下,有一个API可以使自动下载更容易。你一定是指.NET WebClient类,因为没有“C#WebClient”。你所说的原始问题是针对VB.NET的,我在回答中链接的关于Stackoverflow的现有问题是针对VB.BET的。因为您使用的是C#,所以前面问题的答案中的语法可能会有所不同,但方法是相同的,因为两者都使用.NET类。我编辑了我的答案来澄清这一点。你为什么选中
setCookieHeader!=null
两次?异常:::参数不能为空。参数名称:cookie.domain为什么使用公共
Uri
属性?
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];

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

        return response;
    }
}
if (System.Web.HttpContext.Current.Session["cookie"] != null)
            _cookies = System.Web.HttpContext.Current.Session["cookie"].ToString(); 

     using (WebClient wc =  new WebClient())
        {

            wc.Headers.Add("Cookie", _cookies);
             string HtmlResult = wc.UploadString(bridge_url, myParameters);
            _cookies = wc.ResponseHeaders["Set-Cookie"];
            Debug.WriteLine("Headers" + _cookies); 

            System.Web.HttpContext.Current.Session["cookie"] = _cookies;

        }