2014-10-15 5 views
3

У нас есть библиотека классов, которая анализирует содержимое электронной почты с помощью RazorEngine и отправляет электронное письмо с помощью клиента веб-API.Ошибка отправки электронной почты одновременно с RazorEngine

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

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

Мы используем статический метод Razor.Parse().

Приблизительно 13% отправленных сообщений вызывают следующую ошибку.

Cannot access a disposed object Object name: 'TypeLoader', source : RazorEngine, stackTrace :  
at RazorEngine.Templating.TypeLoader.CreateInstance(Type type) 
in RazorEngine\\src\\Core\\RazorEngine.Core\\Templating\\TypeLoader.cs:line 55 

at RazorEngine.Templating.DefaultActivator.CreateInstance(InstanceContext context) 
in RazorEngine\\src\\Core\\RazorEngine.Core\\Templating\\DefaultActivator.cs:line 20 

at RazorEngine.Templating.TemplateService.CreateTemplate(String razorTemplate, Type templateType, Object model) 
in RazorEngine\\src\\Core\\RazorEngine.Core\\Templating\\TemplateService.cs:line 131 

at RazorEngine.Templating.TemplateService.Parse(String razorTemplate, Object model, DynamicViewBag viewBag, String cacheName) 
in RazorEngine\\src\\Core\\RazorEngine.Core\\Templating\\TemplateService.cs:line 435 

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

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

+0

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

+0

Службе, которую я вызываю, вводится Autofac с использованием области InstancePerHttpRequest(), поэтому каждое отправленное письмо должно использовать отдельный поток. – ThunderDev

+1

Ну, уже это звучит как плохой выбор, даже не рассматривая исключение, которое вы получаете здесь. Вы бы наняли одного почтового перевозчика за каждое письмо, которое вы хотели отправить? Подумайте о нитях как о рабочих; вы только нанимаете работников, когда у вас есть много работы для них. –

ответ

0

У нас была такая же ошибка, но на RunCompile. После некоторых экспериментов выяснилось, что мы воссоздали RazorEngineService для каждого письма, от того же TemplateServiceConfiguration. Хотя последнее не IDisposable, что-то в нем есть.

Восстанавливая TemplateServiceConfiguration каждый раз, непосредственно перед созданием RazorEngineService решает проблему. Однако повторное использование RazorEngineService. Очевидно, что после того, как вы удалили RazorEngineService, что-то в TemplateServiceConfiguration также удалено.

Таким образом, если вы отправляете несколько электронных писем, создайте оба из них: TemplateServiceConfiguration и RazorEngineService для каждого, или создайте их один раз и повторно используйте их.

Смежные вопросы