Где Console.WriteLine входит в ASP.NET?

В приложении J2EE (например, в WebSphere), когда я использую System.out.println(), мой текст переходит в стандартную версию, которая сопоставляется с файлом с помощью консоли администратора WebSphere.

В приложении ASP.NET(например, в IIS), где идет вывод Console.WriteLine()? Процесс IIS должен иметь stdin, stdout и stderr; но отображается stdout для версии Windows/dev/null или я не вижу здесь ключевой концепции?

Я не спрашиваю, если я должен войти туда (я использую log4net), но куда идет выход? Моя лучшая информация пришла из этого обсуждение, где они говорят, что Console.SetOut() может изменить TextWriter, но он все еще не ответил на вопрос о том, что начальное значение Консоли, или как установить его в config/вне кода времени выполнения.

Ответ 1

Если вы посмотрите на класс Console в .NET Reflector, вы обнаружите, что если процесс не имеет ассоциированного консоль, Console.Out и Console.Error поддерживаются Stream.Null (завернуты внутри TextWriter), что является фиктивной реализацией Stream, которая в основном игнорирует все входные данные и не дает выхода.

Таким образом, он концептуально эквивалентен /dev/null, но реализация более оптимизирована: фактического ввода-вывода не происходит с нулевым устройством.

Кроме того, кроме вызова SetOut, невозможно настроить значение по умолчанию.

Ответ 2

Если вы используете System.Diagnostics.Debug.WriteLine(...) вместо Console.WriteLine(), вы можете увидеть результаты в окне Вывод Visual Studio.

Ответ 3

Я нашел этот вопрос, пытаясь изменить вывод журнала DataContext в окно вывода. Поэтому, чтобы кто-то еще пытался сделать то же самое, я сделал это:

class DebugTextWriter : System.IO.TextWriter {
   public override void Write(char[] buffer, int index, int count) {
       System.Diagnostics.Debug.Write(new String(buffer, index, count));
   }

   public override void Write(string value) {
       System.Diagnostics.Debug.Write(value);
   }

   public override Encoding Encoding {
       get { return System.Text.Encoding.Default; }
   }
}

Annd после этого: dc.Log = new DebugTextWriter(), и я могу видеть все запросы в окне вывода (dc - DataContext).

Взгляните на это для получения дополнительной информации: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers

Ответ 4

Если вы используете IIS Express и запускаете его с помощью командной строки, он откроет окно DOS, и вы увидите Console.Write там.

Итак, например, откройте окно командной строки и введите:

"C:\Program Files (x86)\IIS Express\iisexpress" /path:C:\Projects\Website1 /port:1655

Предполагается, что у вас есть каталог веб-сайтов на C:\Projects\Website1. Он запустит IIS Express и будет обслуживать страницы в каталоге вашего сайта. Он оставит окна команд открытыми, и вы увидите там выходную информацию. Скажем, у вас есть файл там, default.aspx, с этим кодом в нем:

<%@ Page Language="C#" %>
<html>
<body>
    <form id="form1" runat="server">
    Hello!

    <% for(int i = 0; i < 6; i++) %>
       <% { Console.WriteLine(i.ToString()); }%>

    </form>
</body>
</html>

Расположите браузер и окна команд, чтобы вы могли видеть их на экране. Теперь введите в свой браузер: http://localhost:1655/. Вы увидите Привет! на веб-странице, но в окне команд вы увидите что-то вроде

Request started: "GET" http://localhost:1655/
0
1
2
3
4
5
Request ended: http://localhost:1655/default.aspx with HTTP status 200.0

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

Ответ 5

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

Ответ 6

Объект TraceContext в ASP.NET записывает в DefaultTraceListener, который выводит на хост-процесс стандартный вывод. Вместо использования Console.Write(), если вы используете Trace.Write, вывод будет идти на стандартный вывод процесса.

Вы можете использовать объект System.Diagnostics.Process для получения процесса ASP.NET для вашего сайта и мониторинга стандартного вывода с помощью события OutputDataRecieved.

Ответ 7

System.Diagnostics.Debug.WriteLine(...); выводит его в окно Immediate в Visual Studio 2008.

Перейти в меню Отладка → Windows → Немедленное:

Enter image description here

Ответ 8

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

Ответ 9

В приложении ASP.NET я думаю, что он переходит в окно вывода или консоли, которое отображается во время отладки.

Ответ 10

Если вы посмотрите в окне отладки, вы увидите console.writelines.

Ответ 11

Это запутывает всех, когда приходит IISExpress. Нет ничего, чтобы читать сообщения консоли. Так, например, в приложениях ASPCORE MVC он настраивается с помощью appsettings.json, который ничего не делает, если вы используете IISExpress.

В настоящее время вы можете просто добавить loggerFactory.AddDebug(LogLevel.Debug); в разделе "Конфигурация", и он по крайней мере покажет вам свои журналы в окне "Отладка".

Хорошие новости CORE 2.0 все это изменится: https://github.com/aspnet/Announcements/issues/255