2010-08-03 12 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