【问题标题】:Determine the URL hostname without using HttpContext.Current?在不使用 HttpContext.Current 的情况下确定 URL 主机名?
【发布时间】:2012-02-08 17:14:21
【问题描述】:

使用当前请求,我可以通过以下方式获取 URL 主机名:

HttpContext.Current.Request.Url.Host

但是 - 我需要在不使用当前请求 (HttpContext.Current) 的情况下确定 URL 主机名。这样做的原因是我的代码是从 onChange 回调中的 SqlDependency 调用的,用于找到 SQL 依赖项。尽管代码驻留在我的网络应用程序中,但没有请求,HttpContext.Current 为空。

我希望我可以从HttpRuntime 获取它,但那里似乎没有任何用处。有什么方法可以获取这些信息吗?

【问题讨论】:

  • 我们的一个网站响应任何提供的主机名。如果不检查传入的请求,就很难确定用于联系我们的主机名。
  • 你想做什么,你的代码什么时候运行?是在 SqlDependency 的 OnChange 事件中,在 App Cache 的 onRemoveCallback 中还是在其他地方?
  • 为清楚起见编辑了问题

标签: c# asp.net httpcontext


【解决方案1】:

如果您在设置事件处理程序时知道主机,那么您应该能够执行以下操作(代码未实际测试):

string host = HttpContext.Current.Request.Url.Host;
var dep = new SqlDependency(cmd);
dep.OnChange += ((sender, args) =>
{
    DoStuff(host);
});

【讨论】:

  • 干杯,我也想解决这个问题,所以假设我可以将我的代码从 Application_OnStart 移到 Session_OnStart 之类的地方(以使 Request 对象可用),我可以按照你的建议传入主机.
【解决方案2】:

如果您从 Web 应用程序运行它,并且它都是托管代码,那么 HttpContext 必须存在。您的子库(假设您的托管代码在库中)是否引用了 System.Web?如果没有,请考虑添加此参考。从那时起,您应该能够使用完全限定的命名空间直接访问 HttpContext:

System.Web.HttpContext.Current.Request.Url.Host

在任何情况下,除非您的代码是非托管的或您的上下文确实不是源自 Web 应用程序,否则 HttpContext 应该在线程处于活动状态时的每一点都可用。

编辑:
根据阅读下面的评论,听起来 SqlDependency 是独立触发的。虽然它在同一个线程上,但它并没有被请求直接触发。由于您要查找的只是主机 url,因此您可以创建一个应用程序变量或静态变量来保存此信息,以防依赖项需要它。

我还看到,HttpContext.Current 可能不可用,HttpContext.Request 可能可用。这些应该是同一个对象,但不一定是。 Host 可能在那里。

【讨论】:

  • HttpContext 存在,但 HttpContext.Current(即当前请求)不存在,因为 web 应用程序中的代码不是由请求触发的,而是由 SQL 依赖回调触发的,因此为 null .
  • 你可以设置一个页面字段为HttpContext.Current(例如_currentContext)并在回调中访问它吗?
  • 谢谢。静态变量可以工作,除了在 sql 依赖事件触发之前应用程序池回收并且没有进行请求(这将设置静态变量)的罕见情况。
【解决方案3】:

您应该使用 IIS api 从您要查找的网站中查询信息。因为根据 IIS 配置,您的 URL 或主机名可能会有所不同。 (想想主机头、端口、协议和类似的东西。

IIS API 的介绍可以在http://learn.iis.net/page.aspx/165/how-to-use-microsoftwebadministration/找到

【讨论】:

  • 这似乎是唯一的方法,但是,它需要额外的权限来询问 IIS,所以我想我可能需要看看我是否可以围绕这个问题编写代码。
【解决方案4】:

怎么样

Environment.MachineName

【讨论】:

  • 抱歉,这行不通,我在同一个盒子上有多个实例,具有不同的主机绑定(site1.xxx.com、site2.xxx.com 等)
  • 我想知道如果 HttpContext 丢失(如您所说),是否可以确定代码执行的上下文。
猜你喜欢
  • 1970-01-01
  • 2010-10-14
  • 2021-05-26
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
相关资源
最近更新 更多