2010-10-04 40 views
6

我试图发送一个简单的POST请求到REST Web服务并打印响应(代码如下,主要取自Yahoo!开发人员文档和提供的一些MSDN代码片段文档)。我希望客户端发送:C#REST客户端使用POST发送数据

请求方法:POST(即我希望$ _ SERVER [ 'REQUEST_METHOD'] == 'POST' 在PHP)
数据:富=栏(即$ _ POST [ '富' ] ==在PHP '酒吧')

然而,这似乎是发送:

请求方法: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数组为空。

回答

9

最终发现,这似乎如果代码编辑,像这样以解决问题的HttpWebRequest.PreAuthenticate属性:

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

从文档我相信这股势力验证实际发送POST请求之前。我不确定为什么类不会自动执行此操作(其他语言的库使此过程透明,除非您明确关闭它),但它已解决了我的问题,并可能为其他人节省另外两天的搜索时间和拔毛。

对于它的价值,PreAuthenticate不需要为GET请求设置,只需要POST,但是如果您为GET请求设置它,一切仍然可以工作,但需要稍微延长。

相关问题