Я наконец смог найти обходной путь для этого.Имейте в виду многословный ответ.
В тегах упоминается Xamarin, над которым я тоже работаю - особенно с iOS.Я думаю, что это может быть ошибка с Mono, но я не зашел так далеко, чтобы подтвердить.
Проблема заключается в способе копирования буфера ответов по умолчанию.В коде RestSharp это выполняется методом расширения в MiscExtensions.cs, который называется ReadAsBytes.Похоже, что при определенных буферах ответа вызов метода Stream.Read не выполняется.Когда это происходит, исключение заставляет RestSharp «сокращать» остальную часть обработки ответа, поэтому код состояния никогда не заполняется, поскольку это происходит после вызова ReadAsBytes.
Хорошая новость заключается в том, что RestSharp делаетдать способ заменить этот вызов ReadAsBytes одним из ваших собственных.Это делается с помощью свойства ResponseWriter объекта IRestRequest.Если у него есть определенная функция, он пропустит вызов ReadAsBytes и вызовет функцию, которую вы ей дали.Проблема в том, что это определяется как Действие, и вы не получаете копию объекта полного ответа, так что это несколько бесполезно.Вместо этого вы должны использовать свойство AdvancedResponseWriter.Этот включает в себя как объект ответа и поток ответа.Но вам все равно нужно установить свойство ResponseWriter, иначе оно не будет обходить обработчик по умолчанию, и вы все равно получите сообщение об ошибке.
Хорошо, так как вы это сделаете?В итоге я реализовал его как обертку для RestClient, чтобы мне не пришлось реализовывать код повсюду.Вот базовая настройка:
public class MyRestClient : RestClient
{
public MyRestClient(string baseUrl) : base(baseUrl)
{ }
public override IRestResponse Execute(IRestRequest request)
{
request.ResponseWriter = s => { };
request.AdvancedResponseWriter = (input, response) => response.RawBytes = ReadAsBytes(input);
return base.Execute(request);
}
private static byte[] ReadAsBytes(Stream input)
{
var buffer = new byte[16 * 1024];
using (var ms = new MemoryStream())
{
int read;
try
{
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{ ms.Write(buffer, 0, read); }
return ms.ToArray();
}
catch (WebException ex)
{ return Encoding.UTF8.GetBytes(ex.Message); }
};
}
}
Метод ReadAsBytes на самом деле является просто копированием / вставкой метода RestSharp ReadAsBytes с добавлением try / catch.Если происходит сбой, он возвращает причину исключения в буфер ответов.Это может или не может быть то, что вы хотите, поэтому измените по мере необходимости.Вам также может понадобиться переопределить другие методы для Execute, но в моем случае это единственный используемый нами метод, поэтому этого было достаточно.
Пока что, похоже, это помогает мне.Возможно, если кто-то станет честолюбивым, он сможет проследить его до Моно, чтобы попытаться увидеть, что ему не нравится в потоке, но у меня нет времени на это в данный момент.
Хорошоудачи!