2013-09-24 2 views
0

Я ищу способ переопределить метод GetResponseStream класса HttpWebResponse, чтобы вернуть пользовательский поток. По сути, моя цель - изменить поток. Не уверен, что это возможно? Это делается в контексте интеграции с веб-службой, и мне нужно отбросить часть содержимого из потока ответов. Есть предположения?Ищете способ переопределить метод GetResponseStream для HttpWebResponse

+0

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

+0

К сожалению, у меня нет доступа к веб-сервису, и он не может быть изменен. – Bukhatir

+0

Нет, я говорил о том, чтобы сделать это со стороны * клиента *. Вы действительно не дали нам много контекста здесь ... –

ответ

0

Я ищу способ, чтобы переопределить метод GetResponseStream из HttpWebResponse класса, для того, чтобы иметь пользовательский поток возвращается.

Прохладный. GetResponseStream виртуально в любом случае, так что вперед, переопределите его и верните все, что захотите. Конечно, вам придется разрабатывать свой код таким образом, чтобы вы не работали с конкретными реализациями класса HttpWebResponse, что редко бывает. Обычно вы получаете экземпляр HttpWebResponse из HttpWebRequest. Так что это плотная связь. Поэтому начните думать о том, как вы могли бы абстрагировать весь контент HTTP в своем коде. Я имею в виду перестать думать с точки зрения HttpWebRequests. Начните думать с точки зрения интерфейсов и абстракций в вашем коде. Это то, что собирается вас сэкономить, и это то, что ослабит связь между различными слоями вашего кода и сделает его единым тестируемым.

Целью этого ответа является то, что ваш код должен быть сконструирован таким образом, чтобы он не зависел ни от каких конкретных классов HttpWebRequest. Вы должны начать думать с точки зрения скрытия этого за абстракцией интерфейса, который вы могли бы легко высмеять в своем модульном тесте.

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

+2

Но для этого требуется создать подкласс HttpWebResponse для начала ... тогда как экземпляр обычно созданный кистями рамки (в 'WebRequest.GetResponse' и т. д.). Можете ли вы привести пример того, как вы переопределили бы его * и использовать его *? (Может быть, есть механизм плагина, который у меня никогда не было причины использовать до ...) –

+0

Да, это то, что требуется. Поэтому вы не должны полагаться на какие-либо специфические HTTP-контексты, такие как HttpWebRequests в коде. И нет, я никогда не буду переопределять методы GetResponseStream в любом случае. были полностью безумны. Я бы скрыл всю зависимость от материала HttpWebrequest за абстракцией интерфейса, которую я мог бы более чем счастливо высмеять в своем модульном тесте. –

0

Вы не можете легко переоценить поведение HttpWebResponse. Либо вы завершаете API веб-сервиса на стороне клиента, как @Jon, предлагаемый в комментарии, либо, если вы действительно хотите предпринять приключений, измените запрос , указав его на прокси-сервер, который будет изменять поток по мере необходимости ,

Это не будет тривиально.

0

Предполагая, что вы можете изменить код, вызывающий GetResponseStream, шаблон адаптера может быть не плохим выбором.

класс 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 

}

// теперь заменить код, как это ....

вар myStream = request.GetResponseStream();

// с ....

вар myStream = новый MyCustomStream (request.GetResponseStream());

+0

Это, вероятно, не будет работать для моего случая , Это веб-сервис java, который я потребляю через .net и отправляю немного контента, который на самом деле терпит неудачу на стороне клиента. Я уже создал подкласс из исходного прокси и переопределил метод GetWebResponse, и в этом методе мне действительно нужно изменить содержимое потока, чтобы при его анализе он не вызывал исключения. Надеюсь, вы получите точку – Bukhatir

+0

Не уверен, что я ... если вы измените ее на уровне потока, который был бы до того, как все разобралось, правильно? – user2812885

+0

yup thats корпус. если я могу просто изменить его в том месте, в котором он будет работать. Синтаксический разбор не подведет. – Bukhatir