【问题标题】:Get host name without using HttpRequest不使用 HttpRequest 获取主机名
【发布时间】:2010-01-29 18:38:59
【问题描述】:

我想在我的 ASP.NET 应用程序中运行“后台作业”(定期,作为单独的线程)。我需要主机名(DNS 名称或 IP)来完成我的任务。问题是HttpContext.Current 可能在此处不可用(它是NULL)。

有没有办法在不使用HttpContext.Current.Request.Url.Host的情况下获得主机名。

【问题讨论】:

  • 起初我以为是 Dns.GetHostName(),但它返回机器的主机名,不一定是请求的主机 url(即,如果您在 IIS 中有多个绑定)。如果您只需要机器的主机名,那么您可以使用 Dns.GetHostName()

标签: asp.net httprequest httpcontext hostname


【解决方案1】:

当主机名在HttpContext.Request.Url.Host 中可用时,这是因为主机名是客户端发送的请求的一部分。例如,向该页面发出请求:

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

在后台线程中运行时,没有可用的请求上下文,并且根本没有主机名的概念。您唯一的选择是将主机名存储在代码或配置中。

稍微偏离主题:在 Web 应用程序中运行计划任务是自找麻烦,而生成线程只处理其中的几个。如果可能,请考虑从 Windows 服务运行计划作业,可能使用 NCron 之类的框架构建。

【讨论】:

  • +1 用于 NCron 链接,我希望我早知道这件事。
  • 嗨,Jorn,您能否详细说明为什么在后台线程中安排常规作业通常是个坏主意?如果这些作业不是非常占用资源并且不会从服务器上占用太多有价值的线程,那么您会遇到什么问题?我问是因为我最近开发了这样的解决方案并且还没有遇到任何问题。
  • @AdrianGrigore 您的应用程序池可能会在不可预见的时间被回收,并且在没有请求的情况下您的工作人员可能无法运行。除此之外,我也认为这是可能的,并且在许多情况下是一种合理的方法。我特别喜欢它附带的简单部署。
【解决方案2】:

也许你可以在你的线程类中添加一个类变量,并在你运行线程类之前用 request.url.host 设置这个变量。

此方法也可以应用于会话对象。

【讨论】:

  • 在这种情况下,我需要等待至少一个请求,然后才开始工作。不好。你的意思是“适用于会话”?我无权访问会话,因为我没有 HttpContext。
【解决方案3】:

请记住,如果您需要后台进程 24/7 独立运行,那么从 Web 应用程序启动“后台作业”是个坏主意。即使您在新线程中启动它。您的网络应用可能有一段时间没有请求。在这种情况下,运行时将关闭进程及其所有“子”线程。为了持续运行,您需要将其作为 Windows 服务运行。否则,Darren 是对的,使用 System.Net.Dns.GetHostName()。

【讨论】:

    【解决方案4】:

    我使用与您相同的方法来安排常规任务,我解决此问题的方法是存储机器名称以供以后在应用程序收到任何类型的 Web 请求时使用。

    这是一个相当肮脏的 hack,但这是唯一的方法,除非您想对其进行硬编码或从外部配置文件中检索它,这对于我的目的来说太危险(不可靠)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-17
      • 2012-12-25
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      相关资源
      最近更新 更多