Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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# HttpWebResponse Cookies未设置重定向_C#_Cookies_Httpwebrequest_Redirectwithcookies - Fatal编程技术网

C# HttpWebResponse Cookies未设置重定向

C# HttpWebResponse Cookies未设置重定向,c#,cookies,httpwebrequest,redirectwithcookies,C#,Cookies,Httpwebrequest,Redirectwithcookies,我正在努力做到以下几点: 发送获取登录页面的GET请求(提示输入用户名、密码并设置cookie) 构建一个POST请求,发送来自#1的cookie和用户名/密码正文(这将返回一个设置的cookie,并重定向到登录用户的网站登录页) 我的问题是302重定向。Web服务器返回带有设置Cookie的302,但是当HttpWebRequests自动重定向时,它不会传递现在更新的Cookie。为了解决这个问题,我尝试设置.AllowAutoRedirect=false,将cookie保存在CookieCo

我正在努力做到以下几点:

  • 发送获取登录页面的GET请求(提示输入用户名、密码并设置cookie)
  • 构建一个POST请求,发送来自#1的cookie和用户名/密码正文(这将返回一个设置的cookie,并重定向到登录用户的网站登录页)
  • 我的问题是302重定向。Web服务器返回带有
    设置Cookie的302,但是当HttpWebRequests自动重定向时,它不会传递现在更新的Cookie。为了解决这个问题,我尝试设置
    .AllowAutoRedirect=false
    ,将cookie保存在CookieCollection中,然后构建第三个HTTP请求:一个到达最终302位置的请求。很遗憾,我无法设置此请求的cookies。我不知道为什么,这让我抓狂

    HTTP请求依次为命名请求、postRequest和重定向请求

    string loginGetUrl = "https://<..>/signin.htm";
    string loginPostUrl = "https://<..>/j_acegi_security_check";
    string loginRedirectUrl = "https://<..>/centraladmin/poslinks.htm";
    
    string postData = String.Format("j_username={0}&j_password={1}", username, password);
    
    CookieCollection cookies = new CookieCollection();
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginGetUrl); 
    request.CookieContainer = new CookieContainer();
    request.CookieContainer.Add(cookies);
    //Get the response from the server and save the cookies from the first request..
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    cookies = response.Cookies;        
    
    HttpWebRequest postRequest = (HttpWebRequest)WebRequest.Create(loginPostUrl);
    postRequest.CookieContainer = new CookieContainer();
    
    // Add the received Cookies from the HTTP Get
    postRequest.CookieContainer.Add(cookies); 
    postRequest.Method = WebRequestMethods.Http.Post;
    postRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
    postRequest.AllowWriteStreamBuffering = false;
    postRequest.ProtocolVersion = HttpVersion.Version11;
    postRequest.AllowAutoRedirect = false;
    postRequest.ContentType = "application/x-www-form-urlencoded";
    
    byte[] byteArray = Encoding.ASCII.GetBytes(postData);
    postRequest.ContentLength = byteArray.Length;
    Stream newStream = postRequest.GetRequestStream(); //open connection
    newStream.Write(byteArray, 0, byteArray.Length); // Send the data.
    newStream.Close();
    
    HttpWebResponse postResponse = (HttpWebResponse)postRequest.GetResponse();
    
    // Save the cookies from the POST login request, then send them on to the redirected URL
    cookies = postResponse.Cookies;
    
    HttpWebRequest redirectRequest = (HttpWebRequest)WebRequest.Create(loginRedirectUrl);
    redirectRequest.CookieContainer = new CookieContainer();
    
    // add cookies from POST
    redirectRequest.CookieContainer.Add(cookies);
    HttpWebResponse redirectResponse = (HttpWebResponse)redirectRequest.GetResponse();
    

    我的头在这一点上撞到了墙上。有什么建议吗?我是不是有什么问题?注意,我通常不会编写C代码,我自己无法解决这个问题,但确实从@malte clasen那里找到了一段有用的代码片段。代码已打开,我已将其附加到此处以保留

    我删除了异步组件,因为它在我的代码中不是必需的

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DracWake.Core
    {
        public class WebClient : IWebClient
        {
            private readonly CookieContainer _cookies = new CookieContainer();
    
            private HttpWebRequest CreateRequest(Uri uri)
            {
                var request = HttpWebRequest.CreateHttp(uri);
                request.AllowAutoRedirect = false;
                request.CookieContainer = _cookies;
                SetHeaders(request);
                var defaultValidator = System.Net.ServicePointManager.ServerCertificateValidationCallback;
                request.ServerCertificateValidationCallback =
                    (sender, certificate, chain, sslPolicyErrors) =>
                        certificate.Subject.Contains("O=DO_NOT_TRUST, OU=Created by http://www.fiddler2.com")
                        || (certificate.Subject == "CN=DRAC5 default certificate, OU=Remote Access Group, O=Dell Inc., L=Round Rock, S=Texas, C=US")
                        || (defaultValidator != null && defaultValidator(request, certificate, chain, sslPolicyErrors));
                return request;
            }
    
            private async Task<string> DecodeResponse(HttpWebResponse response)
            {
                foreach (System.Net.Cookie cookie in response.Cookies)
                {
                    _cookies.Add(new Uri(response.ResponseUri.GetLeftPart(UriPartial.Authority)), cookie);
                }
    
                if (response.StatusCode == HttpStatusCode.Redirect)
                {
                    var location = response.Headers[HttpResponseHeader.Location];
                    if (!string.IsNullOrEmpty(location))
                        return await Get(new Uri(location));
                }   
    
                var stream = response.GetResponseStream();
                var buffer = new System.IO.MemoryStream();
                var block = new byte[65536];
                var blockLength = 0;
                do{
                    blockLength = stream.Read(block, 0, block.Length);
                    buffer.Write(block, 0, blockLength);
                }
                while(blockLength == block.Length);
    
                return Encoding.UTF8.GetString(buffer.GetBuffer());
            }
    
            public async Task<string> Get(Uri uri)
            {
                var request = CreateRequest(uri);
                var response = (HttpWebResponse) await request.GetResponseAsync();
                return await DecodeResponse(response);
            }
    
            private void SetHeaders(HttpWebRequest request)
            {
                request.Accept = "text/html, application/xhtml+xml, */*";
                request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
                request.ContentType = "application/x-www-form-urlencoded";
                request.Headers[HttpRequestHeader.AcceptLanguage] = "en-US,en;q=0.8,de-DE;q=0.5,de;q=0.3";
                request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
                request.Headers[HttpRequestHeader.CacheControl] = "no-cache";
            }
    
            public async Task<string> Post(Uri uri, byte[] data)
            {
                var request = CreateRequest(uri);
                request.Method = "POST";
                request.GetRequestStream().Write(data, 0, data.Length);
                var response = (HttpWebResponse) await request.GetResponseAsync();
                return await DecodeResponse(response);
            }
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    Net系统;
    使用系统文本;
    使用System.Threading.Tasks;
    名称空间DracWake.Core
    {
    公共类网络客户端:IWebClient
    {
    私有只读CookieContainer _cookies=新CookieContainer();
    私有HttpWebRequestCreateRequest(Uri)
    {
    var-request=HttpWebRequest.CreateHttp(uri);
    request.AllowAutoRedirect=false;
    request.CookieContainer=\u cookies;
    SetHeaders(请求);
    var defaultValidator=System.Net.ServicePointManager.ServerCertificateValidationCallback;
    request.ServerCertificateValidationCallback=
    (发件人、证书、链、sslPolicyErrors)=>
    certificate.Subject.Contains(“O=DO\u NOT\u TRUST,OU=Created byhttp://www.fiddler2.com")
    ||(certificate.Subject==“CN=DRAC5默认证书,OU=Remote Access Group,O=Dell Inc.,L=Round Rock,S=Texas,C=US”)
    ||(defaultValidator!=null&&defaultValidator(请求、证书、链、sslPolicyErrors));
    返回请求;
    }
    专用异步任务解码响应(HttpWebResponse)
    {
    foreach(System.Net.Cookie响应中的Cookie.Cookies)
    {
    _添加(新Uri(response.ResponseUri.GetLeftPart(UriPartial.Authority)),cookie);
    }
    if(response.StatusCode==HttpStatusCode.Redirect)
    {
    var location=response.Headers[HttpResponseHeader.location];
    如果(!string.IsNullOrEmpty(位置))
    返回等待获取(新Uri(位置));
    }   
    var stream=response.GetResponseStream();
    var buffer=new System.IO.MemoryStream();
    var块=新字节[65536];
    var blockLength=0;
    做{
    blockLength=stream.Read(block,0,block.Length);
    写入(块,0,块长度);
    }
    while(blockLength==block.Length);
    返回Encoding.UTF8.GetString(buffer.GetBuffer());
    }
    公共异步任务获取(Uri)
    {
    var-request=CreateRequest(uri);
    var response=(HttpWebResponse)wait request.GetResponseAsync();
    返回等待解码响应(响应);
    }
    私有void SetHeaders(HttpWebRequest请求)
    {
    request.Accept=“text/html,application/xhtml+xml,*/*”;
    request.UserAgent=“Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;WOW64;Trident/6.0)”;
    request.ContentType=“application/x-www-form-urlencoded”;
    request.Headers[HttpRequestHeader.AcceptLanguage]=“en-US,en;q=0.8,de-de;q=0.5,de;q=0.3”;
    request.Headers[HttpRequestHeader.AcceptEncoding]=“gzip,deflate”;
    request.Headers[HttpRequestHeader.CacheControl]=“无缓存”;
    }
    公共异步任务Post(Uri,字节[]数据)
    {
    var-request=CreateRequest(uri);
    request.Method=“POST”;
    request.GetRequestStream().Write(data,0,data.Length);
    var response=(HttpWebResponse)wait request.GetResponseAsync();
    返回等待解码响应(响应);
    }
    }
    }
    

    解码响应
    解决了我的问题

    我也有类似的情况,像汤米·欧。但是我正在开发的应用程序,我们使用.NET4.0。非常感谢您的帮助或指导。
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace DracWake.Core
    {
        public class WebClient : IWebClient
        {
            private readonly CookieContainer _cookies = new CookieContainer();
    
            private HttpWebRequest CreateRequest(Uri uri)
            {
                var request = HttpWebRequest.CreateHttp(uri);
                request.AllowAutoRedirect = false;
                request.CookieContainer = _cookies;
                SetHeaders(request);
                var defaultValidator = System.Net.ServicePointManager.ServerCertificateValidationCallback;
                request.ServerCertificateValidationCallback =
                    (sender, certificate, chain, sslPolicyErrors) =>
                        certificate.Subject.Contains("O=DO_NOT_TRUST, OU=Created by http://www.fiddler2.com")
                        || (certificate.Subject == "CN=DRAC5 default certificate, OU=Remote Access Group, O=Dell Inc., L=Round Rock, S=Texas, C=US")
                        || (defaultValidator != null && defaultValidator(request, certificate, chain, sslPolicyErrors));
                return request;
            }
    
            private async Task<string> DecodeResponse(HttpWebResponse response)
            {
                foreach (System.Net.Cookie cookie in response.Cookies)
                {
                    _cookies.Add(new Uri(response.ResponseUri.GetLeftPart(UriPartial.Authority)), cookie);
                }
    
                if (response.StatusCode == HttpStatusCode.Redirect)
                {
                    var location = response.Headers[HttpResponseHeader.Location];
                    if (!string.IsNullOrEmpty(location))
                        return await Get(new Uri(location));
                }   
    
                var stream = response.GetResponseStream();
                var buffer = new System.IO.MemoryStream();
                var block = new byte[65536];
                var blockLength = 0;
                do{
                    blockLength = stream.Read(block, 0, block.Length);
                    buffer.Write(block, 0, blockLength);
                }
                while(blockLength == block.Length);
    
                return Encoding.UTF8.GetString(buffer.GetBuffer());
            }
    
            public async Task<string> Get(Uri uri)
            {
                var request = CreateRequest(uri);
                var response = (HttpWebResponse) await request.GetResponseAsync();
                return await DecodeResponse(response);
            }
    
            private void SetHeaders(HttpWebRequest request)
            {
                request.Accept = "text/html, application/xhtml+xml, */*";
                request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
                request.ContentType = "application/x-www-form-urlencoded";
                request.Headers[HttpRequestHeader.AcceptLanguage] = "en-US,en;q=0.8,de-DE;q=0.5,de;q=0.3";
                request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
                request.Headers[HttpRequestHeader.CacheControl] = "no-cache";
            }
    
            public async Task<string> Post(Uri uri, byte[] data)
            {
                var request = CreateRequest(uri);
                request.Method = "POST";
                request.GetRequestStream().Write(data, 0, data.Length);
                var response = (HttpWebResponse) await request.GetResponseAsync();
                return await DecodeResponse(response);
            }
        }
    }