WebRequest无法获取请求流

时间:2010-09-26 10:54:11

标签: c#

我正在尝试制作一个HttpWebRequest,它为我注册帐号。 我正在使用循环来注册新帐户,只更改了一件事,即用户名。 但由于某种原因它只能工作两次,第三次它会到达某一行调用函数“webRequest.GetRequestStream();”它永远不会完成,它不会抛出错误或任何东西。 这是我的第一个HttpWebRequest,它非常混乱。 对于想知道的人来说,value是一个带有注册“值”的字符串。前两次确实注册了账户,所以它确实有效。

    public static HttpWebRequest Get()
    {
        HttpWebRequest webRequest = WebRequest.Create("http://87.255.55.218/register") as HttpWebRequest;
        webRequest.Method = "POST";
        webRequest.Host = "87.255.55.218";
        webRequest.UserAgent = "Hacker";
        webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        webRequest.Referer = "http://yougothacked.com";
        webRequest.ContentType = "application/x-www-form-urlencoded";

        webRequest.Headers.Add(HttpRequestHeader.KeepAlive, "115");
        return webRequest;
    }

    public static void Register(string username)
    {
        string value = Value.Replace("replace", username);
        WebRequest webRequest = Get();
        webRequest.ContentLength = value.Length;
        Thread.Sleep(50);
        Stream reqStream = webRequest.GetRequestStream();

        reqStream.Write(Encoding.ASCII.GetBytes(value), 0, value.Length);
        Thread.Sleep(50);
        reqStream.Flush();
        reqStream.Close();
        reqStream.Dispose();
    }

可能出现什么问题?

2 个答案:

答案 0 :(得分:2)

查看您发送的RefererUserAgent我从道德观角度对您在此处所做的事情表示怀疑。也就是说,您可以尝试使用WebClient清除代码:

using (var client = new WebClient())
{
    client.Headers[HttpRequestHeader.UserAgent] = "Hacker";
    client.Headers[HttpRequestHeader.Accept] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    client.Headers[HttpRequestHeader.Referer] = "http://yougothacked.com";
    client.UploadValues("http://87.255.55.218/register", new NameValueCollection
    {
        { "username", "foo" },
        { "someOtherParam", "value" }
    });
}

如果这不起作用那么,也许,服务器会限制来自同一IP的多个注册请求。当然,您可以随时联系提供商,并询问他是否可能出现这种情况。

答案 1 :(得分:2)

强烈怀疑问题出现在您未显示的某些代码中 - 即当您使用请求时,您没有正确处理响应。 (就像你应该使用using块中的请求流来放置代码。)

如果您没有处理响应,那么该响应将保持与服务器的连接,直到终结器释放它为止。与各个服务器的连接汇集在一起​​。

简而言之:确保将响应放在using块中,如下所示:

using (WebResponse response = req.GetResponse())
{
    ...
}

我怀疑你会发现它有多少请求。

另一方面,使用Darin建议的WebClient可能会让您的生活变得更简单。