Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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# 尝试使用HttpWebRequest获取身份验证cookie_C#_Httpwebrequest_Screen Scraping_Webclient_Httpwebresponse - Fatal编程技术网

C# 尝试使用HttpWebRequest获取身份验证cookie

C# 尝试使用HttpWebRequest获取身份验证cookie,c#,httpwebrequest,screen-scraping,webclient,httpwebresponse,C#,Httpwebrequest,Screen Scraping,Webclient,Httpwebresponse,我必须从一个安全的站点上抓取一个表,我登录到页面并检索身份验证令牌和任何其他相关cookie时遇到问题。我做错什么了吗 public NameValueCollection LoginToDatrose() { var loginUriBuilder = new UriBuilder(); loginUriBuilder.Host = DatroseHostName; loginUriBuilder.Path = BuildURIPath(DatroseBasePath,

我必须从一个安全的站点上抓取一个表,我登录到页面并检索身份验证令牌和任何其他相关cookie时遇到问题。我做错什么了吗

public NameValueCollection LoginToDatrose()
{
    var loginUriBuilder = new UriBuilder();
    loginUriBuilder.Host = DatroseHostName;
    loginUriBuilder.Path = BuildURIPath(DatroseBasePath, LOGIN_PAGE);
    loginUriBuilder.Scheme = "https";

    var boundary = Guid.NewGuid().ToString();
    var postData = new NameValueCollection();
    postData.Add("LoginName", DatroseUserName);
    postData.Add("Password", DatrosePassword);

    var data = Encoding.ASCII.GetBytes(postData.ToQueryString(false));
    var request = WebRequest.Create(loginUriBuilder.Uri) as HttpWebRequest;
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = data.Length;
    using (var d = request.GetRequestStream())
    {
        d.Write(data, 0, data.Length);
    }

    var response = request.GetResponse() as HttpWebResponse;
    var responseCookies = new NameValueCollection();
    foreach (var nvp in response.Cookies.OfType<Cookie>())
    {
        responseCookies.Add(nvp.Name, nvp.Value);
    }

    //using (var responseData = response.GetResponseStream())
    //using (var responseReader = new StreamReader(responseData))
    //{
    //    var theResponse = responseReader.ReadToEnd();
    //    Debug.WriteLine(theResponse);
    //}

    return responseCookies;

}
public NameValueCollection LoginToDatrose()
{
var loginUriBuilder=new UriBuilder();
loginUriBuilder.Host=DatroseHostName;
loginUriBuilder.Path=BuildURIPath(DatroseBasePath,登录页面);
loginulibuilder.Scheme=“https”;
var boundary=Guid.NewGuid().ToString();
var postData=new NameValueCollection();
添加(“LoginName”,DatroseUserName);
添加(“密码”,DatrosePassword);
var data=Encoding.ASCII.GetBytes(postData.ToQueryString(false));
var request=WebRequest.Create(loginuribilder.Uri)作为HttpWebRequest;
request.Method=“POST”;
request.ContentType=“application/x-www-form-urlencoded”;
request.ContentLength=data.Length;
使用(var d=request.GetRequestStream())
{
d、 写入(数据,0,数据长度);
}
var response=request.GetResponse()作为HttpWebResponse;
var responseCookies=新名称valuecollection();
foreach(响应中的var nvp.Cookies.OfType())
{
添加(nvp.Name,nvp.Value);
}
//使用(var responseData=response.GetResponseStream())
//使用(var responseReader=新的StreamReader(responseData))
//{
//var theResponse=responseReader.ReadToEnd();
//Debug.WriteLine(响应);
//}
返回应答书;
}
我在返回对象中没有得到任何值。它不会失败。
theResponse
(未注释时)的值似乎是登录页面的HTML


非常感谢您的帮助。

好的,这里的问题似乎与传递凭据后发生的302重定向有关。
HttpWebRequest
将自动跟随302

最终,我做的事情有点不同。首先,我将
WebClient
类划分为以下子类:

public class CookiesAwareWebClient : WebClient
{
    private CookieContainer outboundCookies = new CookieContainer();
    private CookieCollection inboundCookies = new CookieCollection();

    public CookieContainer OutboundCookies
    {
        get
        {
            return outboundCookies;
        }
    }
    public CookieCollection InboundCookies
    {
        get
        { 
            return inboundCookies; 
        }
    }

    public bool IgnoreRedirects { get; set; }

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = outboundCookies;
            (request as HttpWebRequest).AllowAutoRedirect = !IgnoreRedirects;
        }
        return request;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
        if (response is HttpWebResponse)
        {
            inboundCookies = (response as HttpWebResponse).Cookies ?? inboundCookies;
        }
        return response;
    }
}
public NameValueCollection LoginToDatrose()
{
    var loginUriBuilder = new UriBuilder();
    loginUriBuilder.Host = DatroseHostName;
    loginUriBuilder.Path = BuildURIPath(DatroseBasePath, LOGIN_PAGE);
    loginUriBuilder.Scheme = "https";

    var postData = new NameValueCollection();
    postData.Add("LoginName", DatroseUserName);
    postData.Add("Password", DatrosePassword);

    var responseCookies = new NameValueCollection();

    using (var client = new CookiesAwareWebClient())
    {
        client.IgnoreRedirects = true;
        var clientResponse = client.UploadValues(loginUriBuilder.Uri, "POST", postData);
        foreach (var nvp in client.InboundCookies.OfType<Cookie>())
        {
            responseCookies.Add(nvp.Name, nvp.Value);
        }
    }

    return responseCookies;
}
这允许我使用一个能够识别cookies的
WebClient
类,以及一个我可以控制重定向的类。然后我重新编写了登录代码,如下所示:

public class CookiesAwareWebClient : WebClient
{
    private CookieContainer outboundCookies = new CookieContainer();
    private CookieCollection inboundCookies = new CookieCollection();

    public CookieContainer OutboundCookies
    {
        get
        {
            return outboundCookies;
        }
    }
    public CookieCollection InboundCookies
    {
        get
        { 
            return inboundCookies; 
        }
    }

    public bool IgnoreRedirects { get; set; }

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            (request as HttpWebRequest).CookieContainer = outboundCookies;
            (request as HttpWebRequest).AllowAutoRedirect = !IgnoreRedirects;
        }
        return request;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);
        if (response is HttpWebResponse)
        {
            inboundCookies = (response as HttpWebResponse).Cookies ?? inboundCookies;
        }
        return response;
    }
}
public NameValueCollection LoginToDatrose()
{
    var loginUriBuilder = new UriBuilder();
    loginUriBuilder.Host = DatroseHostName;
    loginUriBuilder.Path = BuildURIPath(DatroseBasePath, LOGIN_PAGE);
    loginUriBuilder.Scheme = "https";

    var postData = new NameValueCollection();
    postData.Add("LoginName", DatroseUserName);
    postData.Add("Password", DatrosePassword);

    var responseCookies = new NameValueCollection();

    using (var client = new CookiesAwareWebClient())
    {
        client.IgnoreRedirects = true;
        var clientResponse = client.UploadValues(loginUriBuilder.Uri, "POST", postData);
        foreach (var nvp in client.InboundCookies.OfType<Cookie>())
        {
            responseCookies.Add(nvp.Name, nvp.Value);
        }
    }

    return responseCookies;
}
public NameValueCollection LoginToDatrose()
{
var loginUriBuilder=new UriBuilder();
loginUriBuilder.Host=DatroseHostName;
loginUriBuilder.Path=BuildURIPath(DatroseBasePath,登录页面);
loginulibuilder.Scheme=“https”;
var postData=new NameValueCollection();
添加(“LoginName”,DatroseUserName);
添加(“密码”,DatrosePassword);
var responseCookies=新名称valuecollection();
使用(var client=new CookiesAwareWebClient())
{
client.IgnoreRedirects=true;
var clientResponse=client.UploadValues(loginuribilder.Uri,“POST”,postData);
foreach(client.InboundCookies.OfType()中的var nvp)
{
添加(nvp.Name,nvp.Value);
}
}
返回应答书;
}

…一切都很顺利。

您可以在httpwebrequest具有AllowDirect属性的地方使用它。你可以设置错误;