2009-08-13 4 views
0

У меня есть некоторые C#-заглушки для веб-службы Java (Https) (созданной в Visual Studio 2008, .NET 2.0). Сервер не разрешает выполнение запросов. Я смог установить sendChunked в false в HttpWebRequest.HttpWebRequest для сервера, который не разрешает chunking, не работает

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

Вот две странные вещи:

  1. Это прекрасно работает через Java, установив HttpConstants.CHUNKED ложь, и если вы этого не сделаете, что он порывает с тем же «Не удалось разобрать ошибки запроса» ,
  2. Если у меня есть скрипач, работающий в фоновом режиме, все работает отлично ?! Я считаю, что это связано с тем, что Fiddler буферизует байты запроса перед их отправкой. ПРИМЕЧАНИЕ. Если я отключу параметр Fiddler для «Расшифровать HTTPS», он перестанет работать.
+0

Буферизация Fiddler может объяснить, почему проблема не воспроизводится, но это говорит о том, что проблема на самом деле не является кодировкой Chunked, поскольку Fiddler не удаляет кодировку Chunked, если вы не сообщите об этом. – EricLaw

ответ

0

Ах, классический «изменение поведения путем наблюдения за ним». Проблема в том, что, как вы отмечаете, Fiddler делает кучу буферизации и тому подобное. Один из вариантов может отключить HTTPS (временно) и использовать инструмент пассивного сетевого обнюхивания, например Wireshark, чтобы узнать, соответствует ли .NET настройкам, которые вы устанавливаете.

+0

Есть ли способ имитировать то, что Fiddler делает в моем собственном коде? – 2009-08-13 15:19:28

+0

Хорошо, у меня есть запрос в Wireshark, который я никогда раньше не использовал, есть ли у вас намек на то, что я должен искать? Могу ли я сказать каким-то образом, если он фрагментирован или нет? – 2009-08-13 16:07:33

+0

Информация в Wireshark похожа на то, что вы видите в Fiddler, просто не так декодировано. Щелкните правой кнопкой мыши по одному из пакетов вашего запроса и выберите «follow stream». Вы получите всплывающее окно с данными, идущими туда и обратно - надеюсь, вы увидите там заголовки HTTP и получите представление о том, что происходит. Примечание. Wireshark может * не * видеть через HTTPS, поэтому вам придется использовать стандартный HTTP для его использования. Если это не перерыв по HTTP, это не поможет вам. –

0

Я не понимаю, из вашего описания, что вы подразумеваете под «заглушками». Вы имеете в виду, что создали веб-ссылку на службу Java?

Если да, то вы можете переопределить метод GetWebRequest вернуть свой собственный HttpWebRequest с SendChunked имущества установлен в ложь:

public partial class Service1 
{ 
    protected override WebRequest GetWebRequest(Uri uri) 
    { 
     HttpWebRequest request = (HttpWebRequest) base.GetWebRequest(uri); 
     request.SendChunked = false; 
     return request; 
    } 
} 

Если это не то, что вы спрашиваете, то просьба уточнить.

+0

Да, заглушки - это веб-ссылка на службу Java. Ваш код выше соответствует именно тому, что у меня есть.Однако, похоже, что полный запрос не попадает на сервер по какой-то причине, но делает это, когда работает Fiddler. – 2009-08-13 15:14:48

+0

Возможно, вам понадобится использовать монитор сети Microsoft или что-то менее навязчивое. См. Http://www.microsoft.com/downloads/details.aspx?FamilyID=983b941d-06cb-4658-b7f6-3088333d062f&displaylang=en. –

+0

В частности, это не похоже на проблему с каналами. Это может быть красная селедка. –

0

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

+1

Если вы возьмете свой измененный код, захватите запрос через Fiddler и возьмите свой первоначальный запрос, захваченный через Fiddler, вы можете использовать Windiff два, чтобы точно увидеть, как они отличаются. – EricLaw