Есть ли способ проверить WebResponse, не затрагивая основной поток ответов в .NET? - PullRequest
4 голосов
/ 27 октября 2010

После вызова начального метода HttpWebResponse.GetResponseStream () и чтения потока, этот поток выполнен и не может быть повторно использован.

У меня есть ситуация, когда мне нужно проверить содержание ответа и, если оно содержит определенные данные, получить другую страницу, а затем передать новый ответ по строке. В противном случае передайте исходный ответ как есть. Единственная проблема заключается в том, что после проверки ответа на проверку этих «специальных данных» этот ответ не годится для нижестоящего кода.

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

Есть ли альтернативные способы справиться со сценарием, подобным этому?

Ответы [ 3 ]

4 голосов
/ 27 октября 2010

Как насчет этого:

using (var client = new WebClient())
{
    string result = client.DownloadString("http://www.foo.bar");
    // TODO: examine result as much as you wish
}

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

2 голосов
/ 27 октября 2010

Вы пытались установить Положение потока обратно в 0 ?

После того, как вы обработали поток, курсор находится в конце потока,Вот почему, когда ASP.NET начинает обрабатывать поток, нечего читать.Попробуйте переместить курсор в начало потока - тогда ASP.NET сможет прочитать весь запрос.

1 голос
/ 28 октября 2010

Похоже, это может быть правильным местом для инспектора сообщений .Вы бы перезаписали AfterReceiveRequest, чтобы найти соответствующие «определенные данные».Если нет «определенных данных», поместите копию обратно в тело сообщения и удалите ее, в противном случае вы можете вызвать событие или выдать исключение, которое ваш код перехватит, а затем «пойти и получить эту другую страницу».

С помощью инспектора сообщений вы можете просматривать входящие / исходящие данные, изменять их, если хотите, или передавать без изменений в исходное место назначения.

Примечание: для инспекторов сообщений и пользовательского поведения вам потребуется .NET 3.0 или выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...