-1

这让我发疯,我不知道我在哪里丢球。我已经按照通过 googlemonsta 找到的一些示例进行了操作,但均无济于事。任何指向我犯错的地方都会受到极大的关注。

        var writer = new StringWriter();
        param = "location=" + Server.UrlEncode(param);
        byte[] paramStream = Encoding.ASCII.GetBytes(param + "&param2=value");
        var URL = "http://www.somesite.com";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2";
        request.ContentLength = paramStream.Length;
        using( var stream = request.GetRequestStream())
        {
            stream.Write(paramStream, 0, paramStream.Length);
        }

        var response = request.GetResponse();

        string result;
        using (var sr = new StreamReader(response.GetResponseStream()))
        {
            result = sr.ReadToEnd();
        }

谢谢!

编辑:据我所知,它击中了网站(我正在返回 html),但参数并没有被推倒。如果它成功了,我基本上得到了价值出现的地方。我试过删除第一个 & 但没有得到任何地方。

编辑:编辑代码以反映更改。

4

3 回答 3

3

可能从第一个参数的开头摆脱 & ?除此之外,它基本上看起来还可以。(检查您的真实代码中的参数名称 - 您在示例中拥有“参数”,它几乎肯定应该是“参数” - 但我们不知道您的真实代码是什么样子或真实网站期望什么。)

请提供有关实际情况的更多信息。我们知道它不起作用,但是有很多不同的可能的故障模式:)

出现了一个额外的想法 - 您没有指定内容长度。我不确定这是否由WebRequest. 值得使用WireShark检查它是否存在于出站请求中。

作为一般实践点,您应该处理 ,如果您已经获得了响应流的声明,则WebResponse无需调用:Closeusing

string result;
using (WebResponse response = request.GetResponse())
{
    using (var sr = new StreamReader(response.GetResponseStream()))
    {
        result = sr.ReadToEnd();
    }
}
于 2009-03-30T16:48:08.443 回答
1

您确定您拥有该职位所需的所有价值观吗?我曾经有一个案例,表单上有一个隐藏的输入字段,类似于:

<input name="action" type="hidden" id="action" value="login">

我必须将其作为参数提供:

&action=login

确保您没有遗漏表格中的任何内容,这就是我所说的...

编辑:还有一件事:我刚刚再次查看了我的代码,并注意到我在那里也有这一行:

request.ContentLength = bytes.Length;

不确定您是否需要,但我注意到您没有设置长度。

于 2009-03-30T17:09:34.757 回答
0

这不是参数后的回车/换行那么简单吗?查看互联网上有关 HTTP 的一些文档,之后您显然需要一个空行。

(我建议手动远程登录到 Web 服务器并粘贴您的请求。)

于 2009-03-30T18:04:01.367 回答