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

Mat*_*rts 15 c# asp.net httpcontext

使用当前请求,我可以获取URL主机名:

HttpContext.Current.Request.Url.Host
Run Code Online (Sandbox Code Playgroud)

但是 - 我需要在不使用当前请求(HttpContext.Current)的情况下确定URL主机名.这样做的原因是我的代码是SqlDependency在onChange回调中从a 中调用的,当时发现了SQL依赖关系.虽然代码驻留在我的Web应用程序中,但没有请求,并且HttpContext.Current为null.

我希望我可以抓住它HttpRuntime,但似乎没有什么用处.有没有办法可以获得这些信息?

Joe*_*ton 6

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

System.Web.HttpContext.Current.Request.Url.Host
Run Code Online (Sandbox Code Playgroud)

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

编辑:
基于阅读下面的评论,听起来像是独立激发SqlDependency.虽然它在同一个线程上,但它不是由请求直接触发的.由于您要查找的只是主机URL,因此您可以创建应用程序变量或静态变量以在依赖项需要时保存此信息并不是不可思议的.

我也看到的是,虽然HttpContext.Current可能没有,但HttpContext.Request可能是.这些应该是同一个对象,但它们可能不一定是.可能会在那里找到主机.


Jou*_*ney 3

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

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