C#REST客户端使用POST发送数据

我正在尝试向REST Web服务发送一个简单的POST请求并打印响应(代码如下,主要来自Yahoo!开发人员文档和一些文档提供的MSDN代码片段)。 我希望客户发送:

请求方法:POST(即我希望PHP中的$ _SERVER [‘REQUEST_METHOD’] ==’POST’)
数据:foo = bar(即PHP中的$ _POST [‘foo’] ==’bar’)

但是,它似乎在发送:

请求方法:FOO = BARPOST
数据:(空白)

我知道API是有效的,因为我已经用Python和PHP编写的客户端进行了测试,所以我很确定它一定是我的C#的问题。 我不是一个交易的.NET程序员,所以会很感激任何关于如何弄清楚问题是什么的评论/指示 – 我确信它是微不足道的但是我自己无法发现它。

uri,用户和密码变量在代码中设置得更早 – 它们可以正常使用GET请求。

request = (HttpWebRequest) WebRequest.Create(uri); request.Credentials = new NetworkCredential(user, password); request.Method = WebRequestMethods.Http.Post; request.ContentType = "application/x-www-form-urlencoded"; string postData = "foo=bar"; request.ContentLength = postData.Length; StreamWriter postStream = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII); postStream.Write(postData); postStream.Close(); response = (HttpWebResponse) request.GetResponse(); 

REST API是用PHP编写的,当使用C#客户端时,$ _POST数组在服务器上是空的。

最终找到了HttpWebRequest.PreAuthenticate属性,如果编码代码似乎解决了这个问题:

 request = (HttpWebRequest) WebRequest.Create(uri); request.PreAuthenticate = true; request.Credentials = new NetworkCredential(user, password); request.Method = WebRequestMethods.Http.Post; 

从文档中我假设这会在发送实际POST请求之前强制进行身份validation。 我不确定为什么这个类不会自动执行此操作(其他语言的库使这个过程透明,除非你明确地将其关闭),但它已经解决了我的问题,可能会为其他人保存另外2天的搜索和拔毛。

对于它的价值,PreAuthenticate不需要为GET请求设置,只需要POST,但是如果你为GET请求设置它,一切都会工作,但需要稍长一些。