D'où vient la Console.WriteLine entrer ASP.NET je ne sais pas.
dans une application J2EE (comme une application tournant dans WebSphere), quand j'utilise System.out.println()
, mon texte va à standard out, qui est mappé à un fichier par la console d'administration WebSphere.
dans un ASP.NET application (comme un tournant dans IIS), où va la sortie de Console.WriteLine()
? Le processus IIS doit avoir un stdin, stdout et stderr; mais est-ce que stdout est mappé à la version Windows de /dev / null ou est-ce que je manque un concept clé ici?
je suis Je ne demande pas si je dois m'y connecter (j'utilise log4net), mais où va la sortie? Ma meilleure info est venue de ce discussion où ils disent Console.SetOut()
peut changer le TextWriter
, mais il n'a toujours pas répondu à la question sur ce que la valeur initiale de la Console est, ou comment le configurer dans config/en dehors du code d'exécution.
11 réponses
si vous regardez la classe Console
dans réflecteur.net , vous verrez que si un processus n'a pas de console associée, Console.Out
et Console.Error
sont soutenus par Stream.Null
(enveloppé dans un TextWriter
), qui est une implémentation factice de Stream
qui ignore fondamentalement toute entrée, et ne donne aucune sortie.
est donc l'équivalent conceptuel de /dev/null
, mais la mise en œuvre est plus rationalisée: il n'y a pas L'entrée/sortie réelle ayant lieu avec le dispositif null.
aussi, à part l'appel de SetOut
, il n'y a aucun moyen de configurer la valeur par défaut.
si vous utilisez System.Diagnostics.Debug.WriteLine(...)
au lieu de Console.WriteLine()
, alors vous pouvez voir les résultats dans la fenêtre sortie de Visual Studio.
j'ai trouvé cette question en essayant de changer la sortie Log du DataContext vers la fenêtre de sortie. Donc, à tous ceux qui essayaient de faire la même chose, ce que j'ai fait était de créer ceci:
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; }
}
}
Et après que: dc.Log = new DebugTextWriter() et je peux voir toutes les requêtes dans la fenêtre de sortie (dc est le DataContext).
Regardez ceci pour plus d'informations: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers
si vous utilisez IIS Express et que vous le lancez via une invite de commande, il laissera la fenêtre DOS ouverte, et vous y verrez les déclarations Console.Write
.
par exemple, ouvrez une fenêtre de commande et tapez:
"C:\Program Files (x86)\IIS Express\iisexpress" /path:C:\Projects\Website1 /port:1655
cela suppose que vous avez un répertoire de site web à C:\Projects\Website1. Il lancera IIS Express et servira les pages de votre annuaire de site web. Il laissera les fenêtres de commande ouvertes, et vous va voir les informations de sortie de là. Disons que vous aviez un fichier par défaut.aspx, avec ce code:
<%@ 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>
Organisez votre navigateur et commandez windows pour que vous puissiez les voir tous les deux à l'écran. Maintenant, tapez dans votre navigateur: http://localhost:1655/
. Vous verrez Bonjour! sur la page web, mais dans la fenêtre de commande, vous verrez quelque chose comme
Request started: "GET" http://localhost:1655/
0
1
2
3
4
5
Request ended: http://localhost:1655/default.aspx with HTTP status 200.0
j'ai fait simple en ayant le code dans un bloc de code dans la balise, mais n'importe quelle console états votre code derrière ou n'importe où ailleurs dans votre code apparaîtra ici aussi.
il n'y a tout simplement pas d'écoute sur la console par défaut. En mode débogage, il y a une console attachée, mais dans un environnement de production c'est comme vous le soupçonniez, le message ne va nulle part parce que rien n'écoute.
sauf si vous êtes dans une application de console stricte, Je ne l'utiliserais pas, parce que vous ne pouvez pas vraiment le voir. Je voudrais utiliser de Trace.WriteLine() pour le débogage type d'information qui peut être activée et désactivée dans la production.
System.Diagnostics.Debug.WriteLine(...);
se retrouve dans la fenêtre immédiate dans Visual Studio 2008.
Aller au menu Debug -> Windows -> Immédiate :
l'objet TraceContext
dans ASP.NET écrit au DefaultTraceListener
qui sort au processus hôte sortie standard . Plutôt que d'utiliser Console.Write()
, si vous utilisez Trace.Write
, la production va aller à la sortie standard du processus.
vous pouvez utiliser l'objet System.Diagnostics.Process
pour obtenir le ASP.NET traiter pour votre site et surveiller la sortie standard en utilisant l'événement OutputDataRecieved
.
c'est déroutant pour tout le monde quand il s'agit de IISExpress. Il n'y a rien à lire dans les messages de la console. Ainsi, par exemple, dans les applications MVC d'ASPCORE, il configure les applications en utilisant appsettings.json qui ne fait rien si vous utilisez IISExpress.
pour le moment, vous pouvez juste ajouter loggerFactory.AddDebug (LogLevel.Debug); dans votre section Configurer et il vous montrera au moins vos logs dans la fenêtre de sortie de Debug.
bonnes nouvelles de base 2.0 ce sera tout changement: https://github.com/aspnet/Announcements/issues/255
dans un ASP.NET application, je pense qu'il va à la fenêtre de sortie ou de Console qui est visible pendant le débogage.