HttpClient WebRequestHandler没有捕获所有cookie

时间:2017-07-27 12:31:26

标签: c# .net cookies

我正在向网站发出POST请求以发送用户名/登录信息,以便获得包含身份验证令牌的烹饪。我构建,测试和调试在控制台应用程序中运行的进程,然后将其设置为作为Windows服务的一部分运行。

当我在控制台应用程序中运行时,从post请求返回2个cookie:JSESSIONID和AuthToken。在Windows服务中部署并运行它之后,我只看到了JSESSIONID。

我设置Fiddler来观看Windows服务,我可以看到AuthToken在我的帖子请求的响应中被传回,但是我无法从cookie容器中获取它。

此外,如果我在我的本地计算机上安装该进程,并通过我的Fiddler代理运行,我可以获得AuthToken,但如果我禁用代理,则cookie.GetCookies结果中不包含AuthToken。

我在本地计算机上作为控制台应用程序运行时,为什么它能正常运行我感到很遗憾,但在远程计算机上作为服务运行时,AuthToken无法返回。

我的本​​地计算机正在运行.net 4.7,并且安装服务的服务器正在运行4.5.2。

这是我正在使用的代码:

public string SubmitPost(Uri uri, string action, string contentPost, bool putRequest)
    {
        CookieContainer cookies = new CookieContainer();
        WebRequestHandler handler = new WebRequestHandler();
            handler.Proxy = new WebProxy("http://<FIDDLER PROXY>:8888", false, new string[] {});
        X509Certificate cert = X509Certificate2.CreateFromSignedFile(m_CertPath);
        handler.ClientCertificates.Add(cert);
        handler.CookieContainer = cookies;
        string resultContent = "";

        using (var client = new HttpClient(handler))
        {

            AddClientHeadersForPost(uri, client);
            cookies.Add(uri, m_jar);

            var content = new StringContent(contentPost, Encoding.UTF8);
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            content.Headers.ContentLength = contentPost.Length;


            HttpResponseMessage result = client.PostAsync(action, content).Result;
            resultContent = result.Content.ReadAsStringAsync().Result;

            IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();

            Logger.InfoFormat("{0} cookies", responseCookies.Count());
            foreach (Cookie item in responseCookies)
            {
                Logger.InfoFormat("Cookie: {0}", item.Name);
                if (item.Name.Contains("auth"))
                {
                        Logger.InfoFormat("Auth Token: {0}", item.Value);
                }
                m_jar.Add(item);
            }
        }
        return (resultContent);
    }

    protected virtual void AddClientHeadersForPost(Uri uri, HttpClient client)
    {
        client.BaseAddress = uri;
        client.DefaultRequestHeaders.TryAddWithoutValidation("Host", "<HOST URL>");
        client.DefaultRequestHeaders.TryAddWithoutValidation("Origin", "<ORIGIN URL>");
        client.DefaultRequestHeaders.TryAddWithoutValidation("X-Requested-With", "XMLHttpRequest");
        client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "*/*");
        client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate, br");
        client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "en-US,en;q=0.8");
        client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36");
        client.DefaultRequestHeaders.TryAddWithoutValidation("DNT", "1");
        client.DefaultRequestHeaders.TryAddWithoutValidation("Referer", "<REFERER URL>");
        client.DefaultRequestHeaders.TryAddWithoutValidation("X-CSRF-TOKEN", m_csrf);
        client.DefaultRequestHeaders.TryAddWithoutValidation("X-2-CSRF-TOKEN", m_sppCSRF);
        client.DefaultRequestHeaders.TryAddWithoutValidation("Connection", "keep-alive");
        client.DefaultRequestHeaders.ExpectContinue = false;
    }

0 个答案:

没有答案