我想在我的ASP.NET应用程序中运行“后台作业”(定期,作为单独的线程)。我需要主机名(DNS名称或IP)来完成我的任务。问题是此处HttpContext.Current
可能无法使用(NULL
)。
有没有办法在不使用HttpContext.Current.Request.Url.Host
的情况下获取主机名。
答案 0 :(得分:8)
当主机名在HttpContext.Request.Url.Host
中可用时,它是主机名是客户端发送的请求的一部分的结果。例如,请向此页面发出请求:
GET /questions/2164261/get-host-name-without-using-httprequest HTTP/1.1 Host: stackoverflow.com ...
在后台线程中运行时,没有可用的请求上下文,并且根本没有主机名的概念。您唯一的选择是将主机名存储在代码或配置中。
稍微偏离主题:在Web应用程序中运行计划任务会产生麻烦,并且生成线程仅处理其中的一些。如果可能,请考虑从Windows服务运行预定作业,可能使用NCron等框架构建。
答案 1 :(得分:1)
可能你可以在你的线程类中添加一个类变量,并在运行线程类之前用request.url.host设置这个变量。
此方法也可以应用于会话对象。
答案 2 :(得分:1)
请记住,如果您需要独立运行全天候运行后台进程,那么从Web应用程序启动“后台作业”是一个坏主意。即使你在新的线程中启动它。您的网络应用可能暂时没有请求。在这种情况下,运行时将关闭进程及其所有“子”线程。要继续运行,您需要将其作为Windows服务运行。否则,Darren是对的,使用System.Net.Dns.GetHostName()。
答案 3 :(得分:0)
我使用与您相同的方法来安排常规任务,我解决此问题的方法是存储计算机名称,以便在应用程序获得任何类型的Web请求时供以后使用。
这是一个相当肮脏的黑客,但除非你想要硬编码或从外部配置文件中检索它,否则这是唯一的方法,这对我来说太危险(不可靠)。