我正在向在线交易REST API发出OAuth 1.0a请求。据我所知,以下代码是发出请求的方式,但是我在request.ContentLength = postData.Length;
行上得到了“在写入已经开始后无法设置此属性”消息...我不明白为什么。如果这不是在OA经过身份验证的Web请求发布之前将其添加到OAuth身份验证的方式,那么它是什么?
var request = consumer.PrepareAuthorizedRequest(new DotNetOpenAuth.Messaging.MessageReceivingEndpoint(new Uri(this.EndPointAddress, relativeUri), method), this.AccessToken);
request.Method = (method == DotNetOpenAuth.Messaging.HttpDeliveryMethods.PostRequest) ? "POST" : "GET";
if (postValues != null && postValues.Count > 0)
{
//There is POST data associated with this request, include it
var postData = KVPCollectionToString(postValues);
request.ServicePoint.Expect100Continue = false;
request.ContentLength = postData.Length;
Logger.Trace(t => t("POST Data: {0}", postData));
using (var stream = request.GetRequestStream())
{
var pBytes = System.Text.Encoding.UTF8.GetBytes(postData);
stream.Write(pBytes, 0, pBytes.Length);
}
}
答案 0 :(得分:3)
简答:
如果要在OAuth请求中传递其他信息,则应使用PrepareAuthorizedRequest
的其他重载之一。您可以为方法提供POST参数列表,以便为您添加请求。
更长的答案:
PrepareAuthorizedRequest
方法会在您获得HttpWebRequest
之前写入请求。这意味着在此之后您无法更改内容长度。
要亲眼看到这一点,您可以深入了解DotNotOpenAuth源代码。如果您查看Channel
课程,根据PrepareAuthorizedRequest
来电的参数,您最终会进入Channel.InitializeRequestAsPost
。你会注意到两件事:
PrepareAuthorizedRequest
。答案 1 :(得分:0)
看起来您正在尝试写入请求流而不是响应字符串,您无法仅修改请求的响应。