C# 在不使用HttpContext.Current的情况下确定URL主机名?

C# 在不使用HttpContext.Current的情况下确定URL主机名?,c#,asp.net,httpcontext,C#,Asp.net,Httpcontext,使用当前请求,我可以通过以下方式获取URL主机名: HttpContext.Current.Request.Url.Host 但是-我需要在不使用当前请求的情况下确定URL主机名(HttpContext.current)。这是因为当找到SQL依赖项时,我的代码是从onChange回调中的SqlDependency调用的。尽管代码驻留在我的web应用程序中,但没有请求,HttpContext.Current为空 我希望我能从HttpRuntime中获取它,但它似乎没有任何用处。有什么办法可以得到

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

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

我希望我能从HttpRuntime中获取它,但它似乎没有任何用处。有什么办法可以得到这些信息吗?

怎么样

Environment.MachineName

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


如果您是从web应用程序运行IIS API,并且它都是托管代码,那么HttpContext必须存在。您的子库(假设托管代码在库中)是否存在如果没有,请考虑添加这个引用。从这点上,您应该能够使用完全限定的命名空间直接访问HtpCurror:

System.Web.HttpContext.Current.Request.Url.Host
在任何情况下,除非您的代码是非托管的,或者您的上下文确实不是由web应用程序生成的,否则HttpContext应该在线程处于活动状态时的每一点都可用

编辑:
根据阅读下面的评论,听起来SqlDependency是独立启动的。虽然它在同一个线程上,但它并不是由请求直接启动的。因为您所寻找的只是主机url,所以您可以创建一个应用程序变量或一个静态变量来在事件中保存此信息并不是不可想象的依赖关系需要它


我还看到,虽然
HttpContext.Current
可能不可用,但
HttpContext.Request
可能不可用。它们应该是相同的对象,但不一定是。可能会在那里找到主机。

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


我们的一个网站响应任何提供的主机名。如果不检查传入的请求,就很难确定用于联系我们的主机名。您想做什么,以及您的代码何时运行?是在SqlDependency的OnChange事件中、在应用缓存的onRemoveCallback中还是在其他地方?编辑了问题为了澄清,很抱歉,这不起作用,我在同一个框中有多个实例,具有不同的主机绑定(site1.xxx.com、site2.xxx.com等),我想知道如果HttpContext丢失,是否可以确定代码执行的上下文(如您所说)。这似乎是唯一的方法,但是,它需要额外的权限来询问IIS,因此我想我可能需要看看是否可以解决此问题。HttpContext存在,但HttpContext.Current(这是当前请求)不会,因为web应用程序中的代码不是由请求触发的,它是由SQL依赖项回调触发的,因此它为空。能否将页面字段设置为
HttpContext.Current
(例如_currentContext)并在回调中访问它?谢谢。静态变量可以工作,但应用程序池回收且未进行重新请求的罕见情况除外(这将设置静态变量)在sql dependency事件触发之前。干杯,我也谈到了这一点,因此假设我可以将代码从应用程序\u OnStart移动到类似会话\u OnStart的位置(以使请求对象可用),我可以按照您的建议传入主机。
string host = HttpContext.Current.Request.Url.Host;
var dep = new SqlDependency(cmd);
dep.OnChange += ((sender, args) =>
{
    DoStuff(host);
});