写作开始后无法设置此属性...我什么时候开始写作?

时间:2013-02-22 01:29:12

标签: c# post oauth httpwebrequest dotnetopenauth

我正在向在线交易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);
    }
}

2 个答案:

答案 0 :(得分:3)

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

更长的答案:

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

要亲眼看到这一点,您可以深入了解DotNotOpenAuth源代码。如果您查看Channel课程,根据PrepareAuthorizedRequest来电的参数,您最终会进入Channel.InitializeRequestAsPost。你会注意到两件事:

  • 您不必将方法设置为POST,DotNetOpenAuth会为您执行此操作。
  • 要在请求中提供参数,您应该使用其他一个带有名称/值对字典的重载将它们传递到PrepareAuthorizedRequest

答案 1 :(得分:0)

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