Где 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