2010-01-29 9 views
7

Ich möchte einen "Hintergrundjob" in meiner ASP.NET-Anwendung (in regelmäßigen Abständen als separater Thread) ausführen. Und ich brauche den Hostnamen (DNS-Name oder IP), um meine Aufgaben zu erledigen. Das Problem ist, dass die HttpContext.Current hier möglicherweise nicht verfügbar ist (es ist NULL).Hostname ohne Verwendung von HttpRequest abrufen

Gibt es eine Möglichkeit, einen Hostnamen zu erhalten, der HttpContext.Current.Request.Url.Host nicht verwendet.

+1

zuerst dachte ich Dns.GetHostName(), aber das gibt den Host-Namen der Maschine, nicht unbedingt die Host-URL der Anfrage (dh wenn Sie mehrere Bindungen in IIS haben). Wenn Sie nur den Host-Namen des Rechners benötigen, können Sie Dns.GetHostName() –

Antwort

7

Wenn der Hostname in HttpContext.Request.Url.Host verfügbar ist, ist dies darauf zurückzuführen, dass der Hostname Teil der vom Client gesendeten Anforderung ist. Als Beispiel eine Anforderung an dieser Seite nehmen:

 
GET /questions/2164261/get-host-name-without-using-httprequest HTTP/1.1 
Host: stackoverflow.com 
... 

Wenn in einem Hintergrund-Thread ausgeführt wird, ist kein Anforderungskontext zur Verfügung, und es gibt wirklich kein Konzept eines Host-Namen alle an. Ihre einzige Alternative besteht darin, den Hostnamen im Code oder in der Konfiguration zu speichern.

Etwas außerhalb des Themas: Das Ausführen geplanter Aufgaben in einer Webanwendung erfordert Ärger und das Erstellen von Threads betrifft nur einige davon. Wenn möglich, sollten Sie Ihre geplanten Jobs von einem Windows-Dienst aus ausführen, der möglicherweise mit einem Framework wie NCron erstellt wurde.

+3

+1 für NCron-Link verwenden, ich wünschte, ich hätte dies vor einiger Zeit gewusst. –

+1

Hallo Jorn, könnten Sie näher darauf eingehen, warum das Planen normaler Jobs in einem Hintergrundthread generell eine schlechte Idee ist? Vorausgesetzt, die Jobs sind nicht sehr ressourcenintensiv und nehmen Sie nicht zu viele wertvolle Threads vom Server weg, welches Problem würden Sie erwarten? Ich frage, weil ich kürzlich eine solche Lösung entwickelt habe und noch keine Probleme hatte. –

+0

@AdrianGrigore Ihr App-Pool wird möglicherweise zu unvorhergesehenen Zeiten recycelt. Wenn keine Anfragen eingehen, werden Ihre Mitarbeiter möglicherweise nicht ausgeführt. Ansonsten halte ich das für möglich und in vielen Fällen für einen vernünftigen Ansatz. Ich mag besonders die einfache Bereitstellung, die damit einhergeht. – John

1

Wahrscheinlich können Sie eine Klassenvariable in Ihrer Thread-Klasse hinzufügen und diese Variable mit request.url.host festlegen, bevor Sie die Thread-Klasse ausführen.

Diese Methode kann auch auf das Sitzungsobjekt angewendet werden.

+0

In diesem Fall muss ich auf mindestens eine Anfrage warten und erst dann den Job starten. Nicht gut. Was meinst du "auf die Sitzung anwenden"? Ich habe keinen Zugriff auf die Sitzung, weil ich keinen HttpContext habe. –

1

Denken Sie daran, dass es eine schlechte Idee ist, diesen "Hintergrundjob" von einer Webanwendung aus zu starten, wenn Sie diesen Hintergrundprozess benötigen, um unabhängig von anderen Benutzern rund um die Uhr laufen zu können. Auch wenn Sie es in einem neuen Thread starten. Ihre Webanwendung hat möglicherweise einige Zeit keine Anfragen. In diesem Fall wird die Laufzeit den Prozess und alle seine "untergeordneten" Threads herunterfahren. Für den kontinuierlichen Betrieb müssen Sie es als Windows-Dienst ausführen. Ansonsten hat der Darren recht, benutze den System.Net.Dns.GetHostName().

0

Ich benutze den gleichen Ansatz wie Sie für die Planung von regelmäßigen Aufgaben und die Art und Weise, wie ich arbeitete um den Maschinennamen für die spätere Verwendung zu speichern, wenn die Anwendung jede Art von Web-Anfrage erhält.

Es ist ein ziemlich schmutziger Hack, aber der einzige Weg, dies zu tun, es sei denn, Sie wollen es hart codieren oder aus einer externen Konfigurationsdatei abrufen, die für meine Zwecke zu gefährlich (unzuverlässig) war.