Я ищу способ переопределить метод GetResponseStream класса HttpWebResponse, чтобы вернуть пользовательский поток. По сути, моя цель - изменить поток. Не уверены, что это возможно? Это делается в контексте интеграции с веб-службой, и мне нужно удалить часть контента из потока ответов. есть идеи?
Ищете способ переопределить метод GetResponseStream HttpWebResponse
Ответы (3)
Я ищу способ переопределить метод GetResponseStream класса HttpWebResponse, чтобы вернуть пользовательский поток.
Прохладно. GetResponseStream
в любом случае виртуальный, так что вперед , переопределите его и верните все, что хотите. Конечно, вам придется проектировать свой код таким образом, чтобы вы не работали с конкретными реализациями класса HttpWebResponse, что бывает редко. Потому что обычно вы получаете экземпляр HttpWebResponse из HttpWebRequest. Так что это тесная связь. Поэтому начните думать о том, как вы можете абстрагировать весь этот HTTP-материал в своем коде. Я имею в виду, перестаньте думать с точки зрения HttpWebRequests. Начните думать с точки зрения интерфейсов и абстракций в вашем коде. Это то, что вас в любом случае спасет, и это то, что ослабит связь между различными слоями вашего кода и сделает его пригодным для модульного тестирования.
Смысл этого ответа в том, что ваш код должен быть разработан таким образом, чтобы он не зависел от каких-либо конкретных классов HttpWebRequest. Вы должны начать думать о том, чтобы скрыть это за абстракцией интерфейса, которую вы могли бы легко смоделировать в своем модульном тесте.
Как только вы абстрагируете свой вызов веб-службы за интерфейс, вы можете очень легко имитировать этот вызов в своем модульном тесте, чтобы проверить фактическое поведение системы, не полагаясь на определенные классы в вашем тесте.
HttpWebResponse
для начала... тогда как экземпляр обычно создается внутренностями фреймворка (в WebRequest.GetResponse
и т. д.). Можете ли вы привести пример того, как вы могли бы переопределить его и использовать? (Может быть, есть механизм плагинов, который у меня никогда не было причин использовать раньше...)
- person Jon Skeet; 25.09.2013
Вы не можете легко изменить поведение HttpWebResponse
. Либо вы обертываете API веб-сервиса на стороне клиента, как предложил @Jon в комментарии, либо, если вы действительно хотите приключений, измените запрос, указав его на прокси-сервер, который будет изменить поток по мере необходимости.
Однако это не будет банально.
Предполагая, что вы можете изменить код, вызывающий GetResponseStream, шаблон адаптера может оказаться неплохим выбором.
class MyCustomStream : Stream { Stream originalStream;
MyCustomStream(Stream originalStream)
{ this.originalStream = originalStream; }
override int Read(byte [] buffer, int offset, int count)
{
byte [] temp = new byte[count];
var ret = originalStream.Read(temp, offset, count);
// modify your buffer if desired
Array.Copy(buffer, temp);
return ret;
}
// implement all the other abstract methods of Stream and just call originalStream
}
// теперь заменяем такой код....
var myStream = request.GetResponseStream();
// с....
var myStream = новый MyCustomStream(request.GetResponseStream());