【发布时间】:2011-10-18 15:51:28
【问题描述】:
我在用 C# 发送 POST 请求时遇到问题,我似乎误解了一些 HTTP 基础知识。所以基本上我正在实现 RESTfull 服务 client,其工作原理如下:
- 使用用户名/密码发出 POST 请求并获取令牌
- 在发出其他 GET/POST/PUT 请求时在标头中使用此令牌 (Authorization:TOKEN)
我使用 WebRequest 发出 GET 请求(带有 Authorization 标头)并且它正在工作。但是当我使用以下代码发出 PUT 请求时,服务会返回“身份验证失败 - 未登录”消息:
String url = String.Format("{0}/{1}", AN_SERVER, app);
WebRequest theRequest = WebRequest.Create(url);
theRequest.Method = "POST";
theRequest.ContentType = "text/x-json";
theRequest.ContentLength = json.Length;
Stream requestStream = theRequest.GetRequestStream();
requestStream.Write(Encoding.ASCII.GetBytes(json), 0, json.Length);
requestStream.Close();
theRequest.Headers.Add("Authorization", authToken);
HttpWebResponse response = (HttpWebResponse)theRequest.GetResponse();
我在发送 POST 请求时一定犯了小错误(至少我希望如此)。那我做错了什么?
谢谢。
【问题讨论】:
-
您是否尝试过将 Headers.Add 移到 requestStream 之前?另一件看起来很奇怪的事情是没有传递给请求的命名参数,例如 requestStream.Write("json=" + json)
-
@AI W:在 requestStream 解决问题之前移动标头。为什么顺序在这里很重要?非常感谢。我花了一天时间尝试“学习”这一点,30 分钟的 Stackoverflow 更有帮助。您能否将其写为答案,以便我接受。再次感谢。顺便说一句,它是 json 对象被放入请求中,而不是命名参数。
-
服务器是否接受非授权服务的PUT请求? IIRC PUT(和 DELETE)在某些版本的 IIS 上默认不启用,因此其他服务器也可能是这种情况。
-
在@AI W 建议的更改之后,PUT 和 POST 都可以正常工作。所以基本上这个问题已经结束。谢谢
-
仅供参考 -
System.Net.HttpRequestHeader枚举具有标准的 HTTP 标头字段名称,因此您不必随意对字符串进行硬编码。HttpRequestHeader.Authorization可以用来代替“授权”。还有WebRequestMethods.Http.Post.
标签: c# .net http restful-authentication