Почему мой вызов веб-службы работает, только если вы «наблюдаете» за соединением? - PullRequest
1 голос
/ 28 января 2009

Хорошо, это настоящий хэдшрейтер.

У меня есть приложение, которое вызывает веб-сервис. Это действительный веб-сервис, который извлекает некоторые данные из базы данных SQL-сервера, помещает их в XML-документ и возвращает их в приложение Winforms для обработки.

Это отлично работает в отладке.

Сбой при нормальном запуске, но при этом он возвращает конкретные данные, которые должны указывать на то, что из БД не возвращены действительные записи с определенным идентификатором.

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

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

Захват пакета, который дает правильный результат, показывает, что приложение выполняет запрос, а затем получает ожидаемые данные.

Захват пакета с ошибкой показывает, что приложение делает запрос, а затем явно получает ошибку «нет записей возвращено».

Одна вещь, которую мы отметили, это то, что для работы требуется около 0,25 / 0,5 секунды, но когда она не работает, она реагирует намного быстрее.

РЕДАКТИРОВАТЬ: Хорошо, я знал, что я что-то забыл. Сначала я был убежден, что это была сама служба. Или SQL. Поэтому я проверил SQL, никаких проблем. Я отлаживал сервис локально. Нет проблем. Я построил тестовый жгут для подачи данных в сервис из моего браузера и записи результата на этикетку. Я дал ему некоторые данные. Это было хорошо. Это не сервис. Сервис в порядке. За исключением, по-видимому, при вызове через мое приложение Winforms, что захват пакета подтверждает отправку правильных данных. И тогда это только терпит неудачу при определенных условиях. Вздох

Кто-нибудь знает, почему это может быть?

Ответы [ 5 ]

2 голосов
/ 28 января 2009

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

1 голос
/ 02 февраля 2009

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

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

Точная причина этого связана с необычным характером нашего продукта и этапами данной банковской операции. Для онлайн-платежей в Великобритании оплата не может быть «Авторизована» до тех пор, пока товар не будет «отправлен».

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

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

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

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

Спасибо всем за помощь. Извините, это было относительно мирское исправление.

0 голосов
/ 29 января 2009

Я сталкивался с подобными проблемами в прошлом. В итоге мне пришлось обернуть метод GetWebRequest и настроить параметры.

namespace [NameSpaceHere]
{
    public partial class [the name of the proxy class created by Visual Studio]
    {
        protected override System.Net.WebRequest GetWebRequest(Uri uri)
        {
            System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);

            // turning this off can cause authentication errors
            //            webRequest.KeepAlive = false;

            webRequest.ProtocolVersion = HttpVersion.Version10;
            webRequest.ServicePoint.Expect100Continue = false;
            return webRequest;
        }
    }
}
0 голосов
/ 29 января 2009

Обновление: я начал мониторинг через WebScarab из OWasp, и после «неудачного» запроса я использовал плагин ручного запроса приложений, чтобы скопировать необработанный запрос и отправить его через Scarab direct.

Эта «провальная» работа потом работала отлично, пару раз.

То, что отправляет приложение winforms, действительно. Есть ли какие-либо настройки связи в запросах веб-службы, которые мне не хватает?

0 голосов
/ 28 января 2009

Дважды проверьте, что ваше приложение winforms не заблокировано FW.

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