ASP.NETアプリケーションで「バックグラウンドジョブ」を実行したい(定期的に、別のスレッドとして)。また、タスクを実行するにはホスト名(DNS名またはIP)が必要です。問題は、HttpContext.Current
ここでは利用できない可能性があることです(ですNULL
)。
を使用せずにホスト名を取得する方法はありますかHttpContext.Current.Request.Url.Host
。
ASP.NETアプリケーションで「バックグラウンドジョブ」を実行したい(定期的に、別のスレッドとして)。また、タスクを実行するにはホスト名(DNS名またはIP)が必要です。問題は、HttpContext.Current
ここでは利用できない可能性があることです(ですNULL
)。
を使用せずにホスト名を取得する方法はありますかHttpContext.Current.Request.Url.Host
。
ホスト名がで使用可能な場合HttpContext.Request.Url.Host
、それはホスト名がクライアントによって送信された要求の一部である結果です。例として、このページへのリクエストを取り上げます。
GET / question / 2164261 / get-host-name-without-using-httprequest HTTP / 1.1 ホスト:stackoverflow.com ..。
バックグラウンドスレッドで実行している場合、要求コンテキストは使用できず、ホスト名の概念はまったくありません。唯一の代替手段は、ホスト名をコード内または構成に保存することです。
少し外れたトピック:Webアプリケーション内でスケジュールされたタスクを実行すると問題が発生し、スレッドの生成ではそのうちのいくつかしか処理されません。可能であれば、NCronなどのフレームワークを使用して構築されたWindowsサービスからスケジュールされたジョブを実行することを検討してください。
おそらく、スレッドクラスにクラス変数を追加し、スレッドクラスを実行する前にこの変数をrequest.url.hostで設定できます。
このメソッドは、セッションオブジェクトにも適用できます。
バックグラウンドプロセスを24時間年中無休で独立して実行する必要がある場合は、Webアプリケーションからその「バックグラウンドジョブ」を開始することはお勧めできません。新しいスレッドで開始しても。Webアプリには、しばらくの間リクエストがない場合があります。この場合、実行時にプロセスとそのすべての「子」スレッドがシャットダウンされます。継続的に実行するには、Windowsサービスとして実行する必要があります。それ以外の場合、Darrenは正しいです。System.Net.Dns.GetHostName()を使用してください。
私は通常のタスクをスケジュールするためにあなたと同じアプローチを使用しています。これを回避する方法は、アプリケーションが何らかのWeb要求を受け取ったときに後で使用できるようにマシン名を保存することです。
これはかなり汚いハックですが、ハードコーディングするか、外部構成ファイルから取得する場合を除いて、これを行う唯一の方法です。これは、私の目的には危険すぎる(信頼できない)ものです。