2013-02-22 1 views
1

Я делаю запрос OAuth 1.0a для онлайн-REST API. Насколько я могу судить, следующий код - способ сделать запрос, но я получаю сообщение «Это свойство не может быть установлено после начала записи» в строке request.ContentLength = postData.Length; ... Я не понимаю, почему. Если это не способ добавить данные POST в аутентифицированный веб-запрос 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); 
    } 
} 

ответ

3

Короткая ссылка: Если вы хотите получить дополнительную информацию в запросе OAuth, вам следует использовать одну из других перегрузок в PrepareAuthorizedRequest. Вы можете предоставить список параметров POST методу, который добавлен к запросу для вас.

Более длинный ответ:

Метод PrepareAuthorizedRequest запишет на запрос, прежде чем вы даже получите HttpWebRequest назад. Это означает, что вы не можете изменить длину контента после этого.

Чтобы убедиться в этом, вы можете вставить исходный код DotNotOpenAuth. Если вы посмотрите на класс Channel, учитывая параметры вашего звонка PrepareAuthorizedRequest, вы в конечном итоге окажетесь в Channel.InitializeRequestAsPost. Вы заметите две вещи здесь:

  • Вам не нужно устанавливать метод POST, DotNetOpenAuth делает это за вас.
  • Чтобы указать параметры в запросе, вы должны передать их в PrepareAuthorizedRequest, используя одну из других перегрузок, в которых используются словари пар имя/значение.
+0

Это хорошая информация, чтобы знать! Модификация моего кода для отправки 'IDictionary ' из моих значений POST успешно создала запрос. Конечно, это не удалось для какой-то общей проблемы с 'signature_method_rejected', но это еще одна проблема. Благодаря! –

0

Это смотреть, как вы пытаетесь писать запрос поток вместо строки ответа, вы не можете изменить запрос только ответ.

+0

Ну, это должно быть возможно * как-то * записать в поток запросов, если у вас есть данные для отправки. Но я даже не дошел до этого; он взорвется на строке 'request.ContentLength = postData.Length;'. –

+1

Я думаю, что вы не понимаете здесь (или я). Запросы и ответные потоки являются частью одного и того же сокета, они просто разделены в InputStream и OutputStream, так сказать. Итак, вы читаете из потока Request и записываете в Response-stream. – Alxandr

+1

Как я делаю запрос, не буду ли я писать на запрос и читать из ответа? Я думаю, вы думаете об этом как о входящем запросе ASP.NET, но это исходящий запрос к внешнему API. Пожалуйста, простите, если я ошибаюсь. –