Запрос POST/PUT с переносимой библиотекой

Мы создали проект переносимой библиотеки классов, чтобы написать проект клиента/оболочки/прокси для нашей службы ASP.NET Web Api Rest.

Начну сразу: похоже, мы не можем выполнять запросы POST/PUT, у которых есть тело.

var dataBytes = Encoding.UTF8.GetBytes(data);

var requestHandle = request.BeginGetRequestStream(ar =>
{
    using (var stream = request.EndGetRequestStream(ar))
    {
        stream.Write(dataBytes, 0, dataBytes.Length); // Exception thrown here
    }
}, null);

Как только я пытаюсь написать запрос, я получаю исключение:

Запрос был прерван: соединение было неожиданно закрыто.

Через некоторое время я понял, что stream.CanWrite имеет значение false, поэтому он недоступен для записи, что в значительной степени означает, что мы не можем выполнять какие-либо POST-запросы с телом.

Может ли кто-нибудь помочь нам здесь и рассказать нам, как мы должны выполнять запросы POST? Я нашел здесь еще один пост, где ответом было взглянуть на RestSharp, но, похоже, он тоже не работает, поскольку он не поддерживает Portable Library.

Любая помощь приветствуется.


person MrSoundless    schedule 20.12.2012    source источник


Ответы (1)


Это не похоже на проблему, связанную с переносимой библиотекой классов. Если вы запустите тот же код в платформенно-зависимой библиотеке, я ожидаю, что он потерпит такой же сбой. Поэтому я ожидаю, что проблема связана либо с тем, как вы создаете или используете HttpWebRequest, либо, возможно, с чем-то на стороне сервера.

На какой платформе вы запускаете это и получаете отказ?

Вы можете ознакомиться с пакетом асинхронного таргетинга (дополнительная информация ). Это добавит поддержку async и await, а также некоторые методы расширения, такие как GetRequestStreamAsync(), поэтому вы сможете использовать следующий код (внутри асинхронного метода):

using (var stream = await request.GetRequestStreamAsync())
{
    stream.Write(dataBytes, 0, dataBytes.Length);
}

Однако поведение должно быть таким же, поэтому я не ожидаю, что это само по себе решит вашу проблему.

person Daniel Plaisted    schedule 21.12.2012
comment
Это фиксированный. Ты был прав. Это не было конкретной проблемой PCL. После небольшой очистки кода мне удалось исправить проблему. Я не помню точно, что было не так, но это было довольно простое решение. - person MrSoundless; 27.12.2012