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

8
我正在尝试向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、user和password变量在代码前面设置 - 它们与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 数组为空。

1个回答

9

最终发现了HttpWebRequest.PreAuthenticate属性,如果将代码编辑如下,则似乎可以解决这个问题:

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

从文档中我推测这个操作会在实际POST请求发送前强制进行身份验证。我不确定为什么该类没有自动执行此操作(其他语言的库会自动处理此过程,除非你明确关闭),但它已经为我解决了问题,也许可以帮助别人节省2天的搜索和头发。

值得一提的是,PreAuthenticate不需要针对GET请求设置,只需要针对POST请求设置,尽管如果你针对GET请求设置了它,一切都还能正常工作,但会稍微慢一些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接