我想在我的 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 /questions/2164261/get-host-name-without-using-httprequest HTTP/1.1 主机:stackoverflow.com ...
在后台线程中运行时,没有可用的请求上下文,并且根本没有主机名的概念。您唯一的选择是将主机名存储在代码或配置中。
稍微偏离主题:在 Web 应用程序中运行计划任务是自找麻烦,而生成线程只处理其中的几个。如果可能,请考虑从 Windows 服务运行您的计划作业,可能使用像NCron这样的框架构建。
请记住,如果您需要该后台进程 24/7 独立运行,那么从 Web 应用程序启动该“后台作业”是一个坏主意。即使您在新线程中启动它。您的网络应用可能有一段时间没有请求。在这种情况下,运行时将关闭进程及其所有“子”线程。为了持续运行,您需要将其作为 Windows 服务运行。否则,Darren 是对的,使用 System.Net.Dns.GetHostName()。
也许您可以在线程类中添加一个类变量,并在运行线程类之前使用 request.url.host 设置此变量。
此方法也可以应用于会话对象。
我使用与您相同的方法来安排常规任务,我解决此问题的方法是存储机器名称以供以后在应用程序收到任何类型的 Web 请求时使用。
这是一个相当肮脏的 hack,但这是唯一的方法,除非您想对其进行硬编码或从外部配置文件中检索它,这对于我的目的来说太危险(不可靠)。