3

次のコードを使用して、Web サイトへの HttpWebRequests を作成しています。

public static HttpWebResponse SendGETRequest(string url, string agent, CookieContainer cookieContainer)
{
   HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
   request.UserAgent = agent;
   request.Method = "GET";
   request.ContentType = "text/html";
   request.CookieContainer = cookieContainer;

   return (HttpWebResponse)request.GetResponse();
}

新しいページを試してみて、ページの最後の部分しか受信しないまで、すべてがいくつかの Web ページで正常に機能しました。これは受け取った応答です:

<tr> 
    <td colspan="2" height="5"><spacer type="block" width="100%" height="5"></td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

ヘッダーは正しく、受信したデータのみが送信されることが示されています。リクエストとレスポンスのヘッダーは次のとおりです。

リクエスト:

GET /Broker/Ops/FichaContratoJS.asp?nc=815044&IP=5&YY=2012&M=6&St=0&CC=FESX201206 HTTP/1.1  
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19  
Content-Type: text/html  
Host: www.xxxx.com  
Cookie: ASPSESSIONIDACBDCDBT=MGDNMNABOANDMILHBNCIDFCH;Autenticacion=Sid=230fae3d%2De0e2%2D4df1%2D8aa8%2D000fb352eaef&IdUsuarioWeb=xxxx; ASPSESSIONIDACBCCDAT=AFDJMNABAFJDDHABLOLAINDK; ASPSESSIONIDCADCBCAT=CEBJGNABLCALPJLDJFPBMLDE

応答:

HTTP/1.1 200 OK  
Date: Wed, 09 May 2012 07:25:03 GMT  
Server: Microsoft-IIS/6.0  
X-Powered-By: ASP.NET  
Pragma: no-cache  
**Content-Length: 155**  
Content-Type: text/html  
Expires: Wed, 09 May 2012 07:24:02 GMT  
Set-Cookie: Autenticacion=Sid=230fae3d%2De0e2%2D4df1%2D8aa8%2D000fb352eaef&IdUsuarioWeb=xxxx; path=/  
Cache-control: no-cache  

Web ブラウザーで同じことを行うと、問題なく動作し、約 4000 バイトのコンテンツ長が返されます。

何か案は?

PD: 念のため、異なるスレッドから同じサイトへの SendGETRequest への呼び出しをいくつか行っていますが、共有変数がないため、違いはないと思います。

編集:これは、ストリームからテキストを抽出するために使用する拡張子です:

    public static string ReadTextResponse(this Stream stream)
    {
        int count;
        Encoding enconding = System.Text.Encoding.GetEncoding(1252);
        System.Text.StringBuilder stringBuilder = new StringBuilder();
        byte[] buffer = new byte[1023];

        do
        {
            count = stream.Read(buffer, 0, buffer.Length);

            if (count != 0)
            {
                string tempString = enconding.GetString(buffer, 0, count);
                stringBuilder.Append(tempString);
            }
        }
        while (count > 0);

        return stringBuilder.ToString();
    }

私の知る限り、それは正しいです。また、サーバーからの応答ヘッダーには、切り捨てられたデータの長さが含まれていることに注意してください。

4

3 に答える 3

1

HttpWebResponseオブジェクトを正しく使用していないと思います。

リクエストを閉じたり、すべてのレスポンスストリームを読んだりしていない可能性があります。

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse.aspx

あなたの方法は次のようになります:

public static string SendGETRequest(string url, string agent, CookieContainer cookieContainer)
    {
        var request = (HttpWebRequest)WebRequest.Create(url);
        request.UserAgent = agent;
        request.Method = "GET";
        request.ContentType = "text/html";
        request.CookieContainer = cookieContainer;

        string result;
        using (var myResponse = (HttpWebResponse) request.GetResponse())
        {
            using (var stream = myResponse.GetResponseStream())
            {
                result = null;
                if (stream != null)
                {
                    using (var sr = new StreamReader(stream, System.Text.Encoding.UTF8))
                    {
                        result = sr.ReadToEnd();
                        sr.Close();
                    }
                    stream.Close();
                }
            }
            myResponse.Close();
        }
        return result;
    }
于 2012-05-09T08:14:03.070 に答える
0

信じられない... URL /Broker/Ops/FichaContratoJS.asp?nc=815044&IP=5&YY=2012&M=6 を送信し、ブラウザーは /Broker/Ops/FichaContratoJS.asp?nc=815044&IP=5&YY=2012&M=06& を送信していた(M パラメータの余分な 0 に注意してください (月です)。そこに 0 を入れると、ページ全体が返されました。私には欠陥のように聞こえます)

于 2012-05-25T10:52:53.833 に答える
0

同様の状況に遭遇し、応答ストリームを MemoryStream にコピーすると問題が解決するように見えることがわかりました。

public static string SendGETRequest(string url, string agent, CookieContainer cookieContainer)
{
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.UserAgent = agent;
    request.Method = "GET";
    request.ContentType = "text/html";
    request.CookieContainer = cookieContainer;

    string result;
    using (var myResponse = (HttpWebResponse) request.GetResponse())
    {
        using (var stream = myResponse.GetResponseStream())
        {
            result = null;
            if (stream != null)
            {
                MemoryStream memStream = new MemoryStream();
                stream.CopyTo(memStream);
                memStream.Flush();
                stream.Close();

                using (var sr = new StreamReader(memStream, System.Text.Encoding.UTF8))
                {
                    result = sr.ReadToEnd();
                    sr.Close();
                }

            memStream.Close();
            }
        }
        myResponse.Close();
    }
    return result;
}
于 2014-03-12T14:27:32.407 に答える