Оптимизация - электронные письма в приложении ASP.NET - PullRequest
0 голосов
/ 02 апреля 2009

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

Один мой коллега предложил использовать отдельный пользовательский веб-сервис, который отправлял бы электронное письмо с использованием сервера smtp?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2009

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

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

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

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

Я думаю, что ваш лучший подход - просто использовать метод SendAsync класса SmtpClient для асинхронной отправки электронной почты.

Например:

SmtpClient client = new SmtpClient(mySMTPHost);
client.SendAsync(myMailMessage, null);

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

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

0 голосов
/ 02 апреля 2009

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

Вызов отдельного пользовательского веб-сервиса звучит для меня немного ненужно. Сам SMTP-сервер может быть вызван удаленно; вызов пользовательского веб-сервиса вместо этого просто добавляет еще один слой. Но, возможно, я неправильно понял идею вашего коллеги.

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