2010-08-03 44 views
1

很长的一点,但有没有办法在ASP.NET中动态获取网站的URL(http://www.example.com),当没有HttpContext。当前可用。ASP.NET - 获取网站的URL没有HttpContext.Current(在后台线程中运行)

没有HttpContext的,因为代码是在后台线程运行*(但根据ASP.NET应用程序域)。我有一个后台进程发送邮件了,每天晚上,并且需要包括网络地址,但我不想硬编码,因为部署和测试(它改变了从http://localhost:12345http://testing.example.com,然后http://www.example.com的现场直播)。

*请不要劝Windows服务,我知道这些,但托管限制,阻止我这样做。

回答

5

您的应用程序必须建立并启动线程。在创建线程时,HttpContext.Current应该可用,存储重要的Web地址的相关部分,并传递给包装线程功能的对象的构造函数,或者如果您没有自定义对象,将其存储在线程可以访问的位置。如果您使用后一种方法,则需要使用lock(){}输入批注部分。

+0

谢谢!我想这样做,我只是担心,因为有可能有不同的URL来访问该网站。例如,某人可以在服务器上键入localhost来访问该站点,并且该地址将永久存储为localhost,包括发送的电子邮件中。对不起,我知道这听起来有点模糊,我只是担心这个东西,也许我太过于工程设计了。 – 2010-08-03 17:05:38

+1

我明白这个问题。如果是localhost,那么它就是启动web应用程序的服务器本身的交互式用户。您可能会将线程启动代码放入Application_BeginRequest中,并且只在当前请求的地址不是localhost并且甚至可能不是内部地址(即:必须是完全限定的地址)时才启动线程。如果你这样做,你需要在线程启动并设置一个标志,并锁定标志读/写访问同步。 – David 2010-08-03 17:58:07

+0

有趣的方法,这可能只是工作。谢谢! – 2010-08-04 11:08:51

1

你怪异的托管限制来看(严重的是,只买一个像样的服务器,而不是,为您节省了不少麻烦)你开始从一个ASP.NET页面线程。只需在启动线程时将URL提供并存储在字段中即可。

+0

downvote的任何理由? – 2010-08-03 16:54:19

+1

“购买新服务器”?这根本没有帮助,并不能解决问题,只是避免它。 – mwalker 2010-08-03 16:54:35

+0

@mwalker:我知道这并不能解决问题,但这是真的应该通过服务来完成的。此外,如果你没有注意到,我也提供了一个解决方案... – 2010-08-03 16:59:42