2013-09-25 37 views
0

最近我們轉換一個網站,Web應用程序。我們部署時一切正常。如果我們允許應用程序關閉(即沒有人使用它1小時),那麼當我們回到它時,Login頁面加載正常,但是然後調用Web服務(舊的SOAP服務)失敗。這不會在開發環境中重現,只能在我們的服務器上重現。ASPNET Web應用程序 - 有些值是零上喚醒

在我們追蹤了一些問題的情況下,似乎一個或多個字符串在使用前未被初始化,導致空字符串或空字符串吹起來。

真正讓我們痛心的一件事是Log4Net日誌記錄完全停止;所以追蹤問題需要大量的代碼。

任何想法的根本原因(希望修復)

======== UPDATE =========

問題的一個追查一個有趣的局面......

失敗產生的服務電話「必須至少指定客戶端屬性」。這是由該

profile.Client = ApplicationName; 

public static string ApplicationName 
{ 
    get 
    { 
    return string.Format(CLIENTNAME, Resources.AppVersion.Version); 
    } 
} 

其中要求設置:

internal static string Version 
{ 
    get 
    { 
     return ResourceManager.GetString("Version", resourceCulture); 
    } 
} 

從概念上講,如果它的工作,一旦它應該永遠不會失敗。

的另一個問題是log4net的不工作時,Web應用程序重新加載,在這裏我們也遇到了靜態

private static readonly ILog ExceptionLog = LogManager.GetLogger("ExceptionLogger"); 
    private static readonly ILog SoaLog = LogManager.GetLogger("soaPerfLogger"); 
    private static readonly ILog InfoLog = LogManager.GetLogger("InfoLogger"); 
    private static readonly ILog DebugLog = LogManager.GetLogger("DebugLogger"); 

原因表面上看來似乎是靜態變量歸零的Web應用程序的重新啓動。他們沒有被重新初始化。

等待輝煌的建議!否則,我將通過代碼中的所有852靜態用法猛擊,以添加代碼來解決這種不尋常的行爲。

+0

想法(?):用Singleton模式封裝ILog。 – granadaCoder

+0

你如何關閉你的web應用程序iisreset/stop? 你重置/回收應用程序池? – Anand

回答

0

肯,

我已經在asp.net靜態成員被嚴重咬傷,因爲它們是在多個asp.net線程共享。 (靜態方法很好。)我不知道這是否可能與您的問題有關,但是您可以使這些實例基於?如果它們的初始化費用很高,請考慮在App Start中將它們存儲爲Application變量,或者可能在Cache中存儲它們。

有可能比一個請求打你上啓動應用程序嗎?如果你的初始化是長時間運行的,當線程/請求#2出現時線程/請求第一個人開始填充值,並將值重新初始化爲空?

這就是說,我不是線程專家,但可以告訴你一個代碼審查/故障排除練習,我以前參加年來的竟然是這個確切的問題,一個偉大的故事。客戶有數以千計的請求發生在短期內,有些人正在覆蓋其他請求填充的數據(並且學生正在註冊錯誤的類。)他們一直在追逐這個問題好幾個星期,在經歷別人的噩夢之後,我避免了在web應用程序中使用靜態成員。

+0

PS:無論我的回覆有什麼價值,我們都應該吃午飯。 – andleer

1

您的靜態字段之間是否存在任何依賴關係,例如:期待他們按照特定順序初始化?如果您的類沒有靜態構造函數,則不能保證它們將被初始化的順序。我總是確保在使用靜態字段時包含靜態構造函數,並且通常在那裏進行初始化,而不是使用字段初始化器。見the C# language specification on static field initialization

我也可以看看granadaCoder的建議,並將它們作爲單例的實例字段,如果這不會太痛苦的話。

此應用程序運行在哪個版本的IIS上?