Время ожидания страницы для отправки электронных писем истекает, даже если электронные письма отправляются

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

В любом случае, у меня есть простое действие GET-POST-Redirect, которое отправляет два отдельных электронных письма с использованием пакета Postal nuget перед перенаправлением на страницу успеха — довольно простые вещи. Действие асинхронное, и я использую await email.SendAsync() из Postal API.

Когда форма отправлена, первое электронное письмо мгновенно попадает в мой почтовый ящик, но код висит на этой строке await email.SendAsync() в течение добрых 15-20 секунд, прежде чем перейти к следующей строке (подтверждено в отладчике). Затем дело доходит до отправки второго письма, которое снова мгновенно приходит в мой почтовый ящик и снова код висит на этой строке, несмотря на успешную отправку, секунд на 15-20, прежде чем перейти на строку с редиректом. В производственной среде эта задержка после отправки электронного письма, объединенная для двух электронных писем, приводит к сбросу соединения до того, как можно будет отправить ответ о перенаправлении. Конечно, я мог бы просто увеличить время ожидания страницы, но на самом деле это не решает проблему, поскольку пользователь по-прежнему получает минутную задержку, прежде чем получит ответ.

Я также пытался отправлять электронные письма синхронно только с email.Send(), но происходит то же самое. Я просмотрел исходный код для Postal, и, хотя он делает некоторые пользовательские обертки вокруг SMTPClient для отправки асинхронной электронной почты, практически ничего, кроме стандартной старой отправки электронной почты C # с синхронным методом Send.

Он также не привязан к серверу, на котором работает сайт, поскольку я вижу одно и то же поведение как в рабочей среде, так и при локальной отладке (хотя оба они подключаются к одному и тому же рабочему серверу Exchange).

Он ведет себя так, как будто ждет, пока сервер Exchange отправит какой-то «законченный» ответ, но, насколько я знаю о SMTP, он так не работает. Он должен просто отправить электронное письмо на SMTP-сервер и продолжить работу, полагая, что SMTP-сервер действительно сделает то, что должен.

Любые идеи будут очень признательны, потому что я даже не уверен, как продолжить отладку на этом этапе. Что еще я мог бы проверить или попробовать?

ОБНОВЛЕНИЕ

Благодаря предложению @MichaelEvanchik попробовать Wireshark, я смог ясно увидеть, что на самом деле существует 30-секундная задержка, вызванная сервером Exchange. Он получает последний бит сообщения электронной почты для отправки, а затем, через 30 секунд, наконец, отвечает клиенту сообщением «Успешно поставлен в очередь на доставку». Именно в этот момент клиент, наконец, ВЫХОДИТ, и код возобновляется. Итак, я возвращаюсь к инфраструктуре.

ОБНОВЛЕНИЕ №2

Таким образом, очевидно, на коннекторе была установлена ​​30-секундная задержка, чтобы подтвердить, что электронное письмо действительно было отправлено, а не просто поставлено в очередь на доставку. Лично я считаю, что в первую очередь это противоречит принципу «в очереди на доставку», но, тем не менее, мне не нужно подтверждение того, что оно на самом деле было отправлено, достаточно того, что оно было получено Сервер Exchange, поэтому инфраструктура устраняет задержку.


person Chris Pratt    schedule 05.11.2013    source источник


Ответы (1)


Wireshark может дать некоторые подсказки. знак равно

Вот как продолжить отладку, и покажет вам все, что происходит с http-сервера на SMTP.

person MichaelEvanchik    schedule 05.11.2013
comment
Я не минусовал вас, но если бы мне пришлось догадываться, почему это сделал кто-то другой, я бы сказал, что ваш первоначальный ответ был довольно кратким. Даже ваш отредактированный ответ не очень полезен. Я достаточно компетентен, чтобы найти Wireshark и понять, как его использовать самостоятельно, но другие, которые могли написать этот вопрос, и другие, которые могут просмотреть его в будущем, могут не быть. Хороший ответ предоставит гораздо больше деталей и, возможно, какое-то базовое использование. Пища для размышлений, прежде чем злиться на людей за то, что они вас минусуют. - person Chris Pratt; 06.11.2013
comment
ваша запись кажется, что вы сделали так много и сделали правильные вещи, я считаю это лучшим решением, в следующий раз я просто попрошу файлы дампа wireshark - person MichaelEvanchik; 06.11.2013
comment
Не поймите меня неправильно; это хорошее предложение, и пока мы разговариваем, я изучаю Wireshark. Моя единственная точка зрения заключалась в том, что, хотя ваш ответ является отличным предложением, он не поучителен. Как я уже сказал, меня это не беспокоит, но я достаточно уверен в своих силах, чтобы самостоятельно разобраться в Wireshark. Однако для кого-то менее уверенного в себе или более зеленого в развитии ваш ответ может быть таким же: создать единую теорию всего. Все дело в перспективе, и StackOverflow поощряет угождать наименьшим из нас, а не ожидать, что все поймут автоматически. - person Chris Pratt; 06.11.2013
comment
Из моего личного опыта отправил ту же инструкцию выше только для того, чтобы поблагодарить Михаила! это показало мне здесь и здесь, в чем проблема мгновенно. Я не могу предположить, что он знает, как обнюхивать пакеты. если бы я это сделал, это было бы несправедливо. Я эксперт в wireshark, и я живу и умираю с ним. Я даже дошел до обратного проектирования протоколов, просто чтобы доказать, что это проблема поставщика. так что стреляйте в меня за то, что я болельщик, и у меня нет места, чтобы оставить комментарий, только ответы, и я не могу сказать о моем поведении в моем ответе, если вы называете мой ответ snyde, это точно, поскольку я счастливый человек - person MichaelEvanchik; 07.11.2013
comment
Крис рад, что ты нашел ответ, как я уже сказал, похоже, ты сделал все, что мог. Ваш ответ пришел бы из двух мест, кто-то, у кого действительно была эта проблема, описанная выше, или кто-то, кто следит за трафиком. Я собирался предложить создать простой класс SMTP для сокетов, чтобы вы могли сами закрыть сокет и отправлять очень простые SMTP-команды, но ваша работа с wirehark опередила меня. но если бы они могли изменить тайм-аут, это было бы обходным путем... QUIT и socket.Close(); - person MichaelEvanchik; 07.11.2013