【问题标题】:This property cannot be set after writing has started... when did I start writing?开始写入后无法设置此属性...我什么时候开始写入的?
【发布时间】:2013-02-22 01:29:12
【问题描述】:

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

【问题讨论】:

    标签: c# post oauth httpwebrequest dotnetopenauth


    【解决方案1】:

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

    更长的答案:

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

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

    • 您不必将方法设置为 POST,DotNetOpenAuth 会为您完成这项工作。
    • 要在请求中提供参数,您应该使用其他重载之一将它们传递到 PrepareAuthorizedRequest,该重载采用名称/值对字典。

    【讨论】:

    • 这是很好的信息!修改我的代码以发送我的 POST 值的 IDictionary<string, string> 成功创建了请求。当然,对于一些通用的signature_method_rejected 问题它失败了,但这是另一个问题。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 如果您有要发送的请求数据,那么它必须有可能以某种方式写入请求流。但我什至没有达到这一点。它在request.ContentLength = postData.Length; 线上爆炸了。
    • 我认为你在这里误解了(或者我是)。请求和响应流都是同一个套接字的一部分,可以说它们只是在 InputStream 和 OutputStream 中分开。所以你从请求流中读取,并写入响应流。
    • 当我提出请求时,我不会写入请求并读取响应吗?我认为您认为这是一个 ASP.NET 入站请求,但这是对外部 API 的出站请求。如果我弄错了,请原谅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多