2

我有一个用 c#.NET 2.0 Windows 应用程序编写的应用程序。我正在尝试使用 HttpWebRequest 和 HttpWebResponse 实现网络爬虫。在这个应用程序中,我对第三方网站同时使用 http get 和 post 请求。本网站为其会员提供用户帐户。

我正在尝试使用定位数据登录此站点,然后进入我的个人资料页面,然后尝试发出另一个 GETrequest,然后使用发布数据发出另一个 POST 请求。但我无法成功提出请求。

它通过一个错误

“服务器违反了协议。Section=ResponseHeader Detail=Header 名称无效”

然后我<httpWebRequest useUnsafeHeaderParsing="true" />在 app.config 文件中设置。之后它抛出一个错误底层连接已关闭:

连接意外关闭:System.Net.WebException。

任何人都可以告诉我显示此错误的原因是什么

我的代码如下。

 request.CookieContainer = objContainer;
        request.KeepAlive = true;

        response = (HttpWebResponse)request.GetResponse();
        dataStream = response.GetResponseStream();
        reader = new StreamReader(dataStream);

        strServerResponse = reader.ReadToEnd();

        reader.Close();
        dataStream.Close();
        response.Close();

        //=======================================================================
        StringBuilder strLinkBuilder = new StringBuilder();

        strLinkBuilder.Append("j_username=username");
        strLinkBuilder.Append("&j_password=password");

        request = (HttpWebRequest)HttpWebRequest.Create(strBaseURL + "j_security_check");

        // Set the Method property of the request to POST.
        request.Method = "POST";

        // Create POST data and convert it to a byte array.
        string postData = strLinkBuilder.ToString();

        byte[] byteArray = Encoding.UTF8.GetBytes(postData);

        // Set the ContentType property of the WebRequest.
        request.ContentType = "application/x-www-form-urlencoded";
        request.KeepAlive = true;


        // Set the ContentLength property of the WebRequest.
        request.ContentLength = byteArray.Length;


        for (int i = 0; i < response.Cookies.Count; i++)
        {
            response.Cookies[i].Path = String.Empty;
        }

        request.CookieContainer = objContainer;
        request.CookieContainer.Add(response.Cookies);


        // Get the request stream.
        dataStream = request.GetRequestStream();
        // Write the data to the request stream.
        dataStream.Write(byteArray, 0, byteArray.Length);

        // Close the Stream object.
        dataStream.Close();

        // Get the response.
        response = (HttpWebResponse)request.GetResponse();

        // Get the stream containing content returned by the server.
        dataStream = response.GetResponseStream();


        // Open the stream using a StreamReader for easy access.
        reader = new StreamReader(dataStream);


        // Read the content.

        strServerResponse = reader.ReadToEnd();

        // Clean up the streams.
        reader.Close();
        dataStream.Close();
        response.Close();              
        //-------------------------------------------------------   

        request = (HttpWebRequest)HttpWebRequest.Create(strBaseURL + "ded/nsdlconsofile.xhtml");

        //request.CookieContainer = objContainer;
        request.KeepAlive = true;
        // request.Method = "POST";

        for (int i = 0; i < response.Cookies.Count; i++)
        {
            response.Cookies[i].Path = String.Empty;
        }

        request.CookieContainer = objContainer;
        request.CookieContainer.Add(response.Cookies);

        response = (HttpWebResponse)request.GetResponse();
        dataStream = response.GetResponseStream();
        reader = new StreamReader(dataStream);

        strServerResponse = reader.ReadToEnd();

        reader.Close();
        dataStream.Close();
        response.Close();
        //-------------------------------------------------------   
        strLinkBuilder = new StringBuilder();

        strLinkBuilder.Append("finYr=2012");
        strLinkBuilder.Append("&qrtr=3");
        strLinkBuilder.Append("&frmType=24Q");
        strLinkBuilder.Append("&download_conso=Go");
        strLinkBuilder.Append("&requestnsdlconsoForm_SUBMIT=1");

        Dictionary<string, string> objNameval = TraceHiddenField(strServerResponse, "");

        foreach (KeyValuePair<string, string> pair in objNameval)
        {
            strLinkBuilder.Append("&" + pair.Key + "=" + pair.Value);

        }


        request = (HttpWebRequest)HttpWebRequest.Create(strBaseURL + "ded/nsdlconsofile.xhtml");

        // Set the Method property of the request to POST.
        request.ContentType = "application/x-www-form-urlencoded";

        request.Method = "POST";
        request.KeepAlive = false;
       // request.ServicePoint.Expect100Continue = false;               
        request.UserAgent = "Mozilla/4.0 (compatible;)";
        request.ProtocolVersion = HttpVersion.Version10;

        // Create POST data and convert it to a byte array.
        postData = strLinkBuilder.ToString();

        byte[] byteData = Encoding.UTF8.GetBytes(postData);

        // Set the ContentType property of the WebRequest.         

        // Set the ContentLength property of the WebRequest.
        request.ContentLength = byteData.Length;


        for (int i = 0; i < response.Cookies.Count; i++)
        {
            response.Cookies[i].Path = String.Empty;
        }

        request.CookieContainer = objContainer;
        request.CookieContainer.Add( response.Cookies);

        // Get the request stream.
        dataStream = request.GetRequestStream();
        // Write the data to the request stream.
        dataStream.Write(byteData, 0, byteData.Length);

        // Close the Stream object.
        dataStream.Close();

        // Get the response.
        response = (HttpWebResponse)request.GetResponse();

        // Get the stream containing content returned by the server.
        dataStream = response.GetResponseStream();

        // Open the stream using a StreamReader for easy access.
        reader = new StreamReader(dataStream);

        strServerResponse = reader.ReadToEnd();

        reader.Close();
        dataStream.Close();
        response.Close();
4

0 回答 0