1

我正在向在线交易 REST API 发出 OAuth 1.0a 请求。据我所知,以下代码是发出请求的方式,但我收到一条“此属性在写入开始后无法设置”消息request.ContentLength = postData.Length;......我不明白为什么。如果这不是在 OAuth 验证的 Web 请求发出之前将 POST 数据添加到它的方法,那是什么?

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);
    }
}
4

2 回答 2

3

简短回答:如果您想在 OAuth 请求中传递其他信息,您应该使用其他重载之一来PrepareAuthorizedRequest. 您可以为添加到请求的方法提供 POST 参数列表。

更长的答案:

PrepareAuthorizedRequest方法将在您返回之前写入请求HttpWebRequest。这意味着您无法在此之后更改内容长度。

要亲自查看此内容,您可以深入研究 DotNotOpenAuth 源代码。如果你看一下这个Channel类,给定你PrepareAuthorizedRequest调用的参数,你最终会在Channel.InitializeRequestAsPost. 你会在这里注意到两件事:

  • 您不必将方法设置为 POST,DotNetOpenAuth 会为您执行此操作。
  • To supply parameters in the request, you should be passing them into PrepareAuthorizedRequest using one of the other overloads which take dictionaries of name/value pairs.
于 2013-02-22T01:47:29.853 回答
0

看起来您正在尝试写入请求流而不是响应字符串,您不能只修改请求响应。

于 2013-02-22T01:32:26.800 回答