2010-01-28 1 views
8

Чтобы решить проблему с отправкой электронной почты через smtp-сервер, на котором не отправляются электронные письма, мне посоветовали включить ведение журнала с использованием System.Diagnosis .TextWriterTraceListener для отслеживания связи с smtp-сервером для отслеживания любых ошибок. Я добавил следующее к моей web.config в узле:Проблема с System.Diagnosis.TextWriterTraceListener не записывает никакого журнала в файловую систему

<system.diagnostics> 
     <trace autoflush="true" /> 
     <sources> 
     <source name="System.Net" > 
      <listeners> 
      <add name="MyTraceFile"/> 
      </listeners> 
     </source> 

     <source name="System.Net.Sockets"> 
      <listeners> 
      <add name="MyTraceFile"/> 
      </listeners> 
     </source> 
     </sources> 

     <sharedListeners> 
     <add 
      name="MyTraceFile" 
      type="System.Diagnostics.TextWriterTraceListener" 
      initializeData="System.Net.trace.log"    /> 
     </sharedListeners> 

     <switches> 
     <add name="System.Net" value="Verbose" /> 
     <add name="System.Net.Sockets" value="Verbose" /> 
     </switches> 
    </system.diagnostics> 

Я попробовал его на моей машине развития, и она работала просто отлично! Я мог легко прочитать полное сообщение с smtp-сервером. Однако в рабочей среде (работающей на IIS 6 в Windows 2003 Server) она не работает вообще. В файловую систему не записывается журнал. Моя первая мысль заключалась в том, что, возможно, учетная запись рабочего процесса ASP.NET (NETWORK SERVICE) не имела достаточных прав для записи в файловую систему в указанном месте. Я исправил это, но до сих пор не получил журнала. Во-вторых, я подумал, что, возможно, папка была установлена ​​только для чтения и исправлена. Но я все равно не записываю журнал.

У кого-нибудь есть идея, в чем проблема? Или, может быть, некоторые советы о том, как я могу это исправить? Thanx заранее!

ответ

3

Прежде всего, я бы проверял, работает ли трассировка, не записывая ничего в файловую систему. То есть, я бы просто использовал обычную трассировку окон. Чтобы просмотреть вывод трассировки, я бы использовал Windows Sysinternals' DebugView. Конечно, возможно, вы должны изменить свой конфигурационный файл, я не знаком с синтаксисом.

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

Куда, по вашему мнению, сохраняется ваш файл журнала? Возможно, это другое место, когда дело доходит до производственной среды. Я думаю, что в Windows Server 2003 вы должны искать свой файл где-то под WinDir, а не в папке (-ах) веб-приложения.

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

Удачи вам!

2

Является ли такая же конструкция в разработке и производстве? Часто константа условной компиляции TRACE не определена в режиме деблокирования. Тогда никакая трассировка не появится.

+0

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

1

Вы пытались использовать Process Monitor, чтобы увидеть, есть ли файл System.Net.trace.log или возникла ошибка при его создании? Возможно ли, что это просто записывается в странное место, которое вы не ищете (я считаю, что по умолчанию должен быть текущий рабочий каталог рабочего процесса ASP.NET).

2

Я хотел бы начать, поставив полный путь в атрибуте initializeData:

<add 
     name="MyTraceFile" 
     type="System.Diagnostics.TextWriterTraceListener" 
     initializeData="c:\SomePath\System.Net.trace.log"     
/> 

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

Когда вы используете относительный путь, как в вашей текущей конфигурации, я считаю, что он будет относиться к корневому каталогу приложения при работе в IIS. Но при работе под Cassini на машине разработки это не так - IIRC будет относиться к% WINDIR% \ System32, но я бы не стал полагаться на это.

+0

Просто для записей, кажется, вы ошибаетесь, и реализация Microsoft проверит, является ли путь, предоставленный в initializeData относительным или нет. http://nicholas.piasecki.name/blog/2009/03/on-textwritertracelistener-inheritance-initializedata-aspnet-and-paths/ – Oscar

+0

@Oscar - интересный блог, указывающий на то, что у какого-то инженера Microsoft был плохой день. Но предлагаемое решение «MungeFileName» может быть заменено более простым «Path.Combine (AppDomain.CurrentDomain.BaseDirectory, fileName)». Метод Path.Combine достаточно умен, чтобы обрабатывать случай, когда его второй аргумент является абсолютным путем сам по себе. – Joe

1

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