使用C#调用POST到外部站点(httpwebrequest)

时间:2009-03-30 16:45:24

标签: c# post httpwebrequest

这让我疯了,我无法弄清楚我丢球的地方。我跟着通过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();
        }

谢谢!

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

正如一般的实践观点,您应该处置WebResponse,如果您已经获得Close声明,则无需致电using响应流:

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

答案 1 :(得分:1)

您确定自己拥有该帖子所需的所有值吗?我曾经有一个案例,表格上有一个隐藏的输入字段,如:

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

我不得不将其作为一个参数提供:

&action=login

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

编辑:还有一件事:我只是在我完成此操作时再次查看了我的代码,并注意到我在那里也有这条线:

request.ContentLength = bytes.Length;

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

答案 2 :(得分:0)

在参数之后,它不是像回车/换行一样简单吗?在互联网上查看HTTP上的一些文档,之后显然需要一个空行。

(我建议手动telnet到网络服务器并粘贴你的请求。)