標籤:
0、先推薦幾款工具,串連遠程用戶端DameWare Mini Remote Control,搜尋本地檔案Everything,以及sysinternals的系列工具:
FileMon-監視所有檔案修改、RegMon-監視所有註冊表修改、ProcessExplorer-工作管理員、ProcessMonitor-監視進程對檔案+註冊表的所有操作
SigCheck-識別檔案頭+簽名+對應的pbd、TcpView-監視所有tcp串連、PsTools系列工具-操作所有本地+遠程進程
1、在一些基於Server 2008 R2的終端機上,經常會出現多使用者進程搶佔同一檔案(比如menuverison.ini)的問題,報IOException,對路徑的訪問被拒絕。
類似的,多個進程寫同一個xml檔案時,會報“缺少根項目”或“根層級上的資料無效”,應該也是類似的問題。
答:這類問題用lock{}是不夠的,lock(Monito)只能同步單進程裡多個線程對資源的訪問,這種跨進程的同步要使用核心鎖,比如基於事件的AutoResetEvent或基於訊號量的Mutex。
2、未能負載檔案或程式集xxx.client.dll或它的某一個依賴項。
答:這是用戶端更新程式下載dll不完整引起的,初步認為是網路層面的問題,導致檔案接收不完整。不妨討論一下用戶端的更新策略:
1)用一個單獨的更新程式updator更新dll和resource檔案,更新程式可以在系統啟動前檢測、也可以以服務的形式在services.msc裡運行。
2)更新內容打包成msi/exe/補丁包的形式,更新程式只負責檢測、下載、安裝更新包。
3)也可以做成安裝包後,由企業域推送、SCCM、VRV等工具推送到使用者機器上。
註:方法2保證了檔案的完整性,但要求使用者有管理員的安裝許可權,在企業環境裡還不如用方法3。方法1需要用hash值等方法驗證檔案的完整性,不然就容易出現如上錯誤。
3、使用者機器上大規模報出ora-12500、ora-12535、ora-12541等錯誤。
答:DB伺服器上%ORACLE_HOME%/Network/log/listener.log裡的日誌如下:
TNS-12500: TNS: listener failed to start a dedicated server process
TNS-12540: TNS: internal limit restriction exceeded
TNS-12560: TNS: protocol adapter error
TNS-00510: internal limit restriction exceeded
HPUX Error: 11: resource temporarily unavailable
看起來主要是tns無法啟動進程,db伺服器是8核CPU、64G記憶體,實際只用了32G。從oracle來看,使用者session數只有200,沒有達到最大值300。因此猜測是伺服器的設定問題,搜尋一下,據說可以把maxupro=nproc*90%,原本maxupro為256,改成3000,同時把ulimit->nofiles從2048改為4096,貌似問題得到了緩解,使用者session也順利超過200。
4、ftp伺服器平時正常,某天突然擁堵,ftp server裡看到大量用戶端排隊,每個用戶端速度只有3K左右。不拋錯不出異常,進度條始終停在下載處。
答:一開始在DB伺服器裡輸入netstat -ano | findstr TIME_WAIT > netstat.log看到有大量的TIME_WAIT狀態。注意到client.config->customBinding->httpTransport->keepAliveEnabled=false,設定為true後是否能用client端的長串連代替多次的短串連。設定後,DB伺服器裡TIME_WAIT確實下去了,但ftp伺服器還是會偶爾出現擁堵的情況。後來,考慮到這個情況是偶爾出現的,應該與代碼無關,由營運室監控網路層面,發現這台機器丟包很嚴重。監測下來,ftp伺服器有1G的頻寬,但直連的路由器只有百M的速度,後來換路由後解決問題。
5、ClickOnce無法啟動應用程式,啟用appref-ms異常。
答:猜測是由於ClickOnce更新到一半,網路問題或是ClickOnce自己的Bug造成的程式檔案損壞或與註冊表中的版本不一致。
解決方案:1)將c:\Documents and Settings\n176197\Local Settings\Apps\下的2.0檔案夾刪除,重新開啟案頭表徵圖即可。
2)或者開啟Regedit,將HKEY_CURRENT_USER\Software\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment節點下的所有內容全部刪除,重新雙擊案頭的appref-ms表徵圖即可。
6、第三方控制項相關問題:regsvr32註冊:DllRegisterServer失敗,傳回碼是0x80004005。或報檢索COM類工廠中CLSID為{4764040E-4222-4DEC-9F2E-82D46E212B3A}的組件時失敗,原因是出現如下錯誤0x80040154。
答:1)由於域環境下,使用者沒有安裝許可權、也沒有註冊com組件(常見的如水晶報表CrystalReport、PDF控制項PDFSDK、FastReport等)的許可權。所以新裝的機器很容易出現控制項未註冊的問題。只需要以管理員權限註冊即可,如果許可權不足,會報上述0x錯誤。
runas /user:domain\admin cmd
regsvr32 fastreport3.dll
cacls c:\client /t /g everyone:C
2)有時Guid指向的是wshom.ocx組件,可以把自己機器上的wshom.ocx拷貝到使用者機器上,用管理員運行 regsvr32 c:\windows\dwrcs\uploads\wshom.ocx,注意不加/i選項,OK!
7、Client更新出錯,彈出MessageBox說對系統Temp目錄無存取權限。
答:在使用臨時目錄時,有時會出現擷取到的臨時目錄沒有許可權。一般來說,調用Path.GetTempPath()方法應該返回使用者的臨時目錄,比如c:\Documents and Settings\user\Local Settings\Temp。但某些使用者切換過使用者目錄後,出現以wangyu1登入,登入成功後開始菜單裡顯示的是wangyuwy(估計是iNode裡設定的使用者名稱),但在c:\Documents and Settings\裡的目錄名卻是wy。由於Path.GetTempPath()裡調用的是Win32Native.GetTempPath,所以只能猜測這個方法想按照使用者名稱wangyu1去擷取臨時目錄,沒取到,於是取系統臨時目錄,但是又沒許可權。
解決方案:1)備份使用者資料->登出目前使用者(或者直接重啟,否則已經登入過的使用者無法刪除)->以管理員身份登入->系統屬性->進階->使用者設定檔->刪除錯誤的使用者->登出->以正確的使用者名稱登入->建立對應的檔案夾->把備份的資料覆蓋回來。
2)簡單的方法是:給系統臨時目錄賦every讀寫權限,cacls c:\windows\temp /E /G everyone:C
3)也有可能是C盤空間不足,不妨cleanmgr /sagaset:99,清空所有資源回收筒、壓縮舊檔案。
8、TCP error code 10048通常每個通訊端地址(協議網路地址連接埠)只允許使用一次。
答:問題其實很明確,可以從以下幾個方面考慮:
1)是否所有client都指定同一個server連接埠;
2)client每次通訊完成後是否有釋放連接埠資源;
3)是否服務端開啟的連接埠數太少,不夠用?
4)是否client要求的並發量太大?
這幾點會導致伺服器連接埠被佔滿,無空閑連接埠可用。我們client裡都未指定特定連接埠,而且都用using{}包裹及時釋放。但client.config裡keepAliveEnabled=true應該改為false,否則會持續佔用連接埠。然後也可以調整服務端的資源上限,修改伺服器配置,提升連接埠上限、降低逾時時間,如下:開啟regedit->找到HKLM\system\CurrentControlSet\Services\Tcpip\Parameters,新增2項MaxUserPort=65534, TcpTimedWaitDelay=5,重啟伺服器即可。
9、IIS裡某個應用程式集區(比如: /LM/w3svc/3/root/Service)裡的所有服務報OutOfMemoryException異常。
答:IIS在運行過程中,每月都會出2-3次記憶體不足的異常,在替換服務的dll後,也會出現這個異常。出錯時能看到某個應用程式集區佔用1.8G以上的記憶體。可以手工強制回收對應的程式池,也可以設定記憶體超過1.5G時觸發回收。當然,最重要的還是代碼裡盡量在DB端過濾資料,而不是取到記憶體裡再計算。
10、1)某個service.dll應該有14M,但用vs2005產生出來只有372K,並且報產生成功。2)同一個檔案,增長到16.5M時,報fatal error cs0013: 將中繼資料寫入檔案obj\debug\service.dll時發生錯誤。
答:1)的情況下,改用msbuild可以正確產生。2)的情況下,msbuild和csc也報同樣的錯誤。並且xp/win7/server 03、vs2005/vs2010下都穩定報錯。分析下來,應該與項目裡包含的字串總長度有關係。因為去掉其中某一兩個檔案,產生能成功,甚至刪除其中一部分代碼或另一部分代碼,也能成功。寫了個測試專案試了下csproj裡到底能包含多少字串:
試下來,產生一個超大的test.cs檔案,56個字元×130000時會報cs0013,14個字元×430000時也報cs0013。不過細節不同:fatal error cs0013: unexpected error writing metadata to file -- 沒有剩餘的邏輯空間來建立更多使用者字串。
雖然錯誤不完全一致,但猜測是項目裡包含了太多的字元/變數/資源等,超出了某個限制,結論是只能拆分項目。
11、DataWindow下拉框一閃即逝,搜狗拼音4.3與dw不相容
答:滿足2個條件,會出現這一問題:1)使用者把所有IME全刪了,只保留搜狗拼音IMEv4.3.0.3315正式版;2)點擊DataWindows下拉框。
一般來說,點擊不允許輸入的控制項時,IME會自動關閉或切換到英文狀態。嘗試使用紫光拼音、微軟拼音都正常,Dx下拉框也正常,搜狗v6.0.0.5972也正常。因此認定是搜狗v4.3的一個Bug。
12、遠程伺服器返回錯誤(400)錯誤的請求
分析:1)登入Client時調用GetMacIpInfo後用戶端GetResponse時出錯。
2)值得注意的是,直接用瀏覽器調用rest服務是OK的,而用代碼訪問會出錯。
3)嘗試用Reflector8對比正確、錯誤的dll,發現加密前的版本是正確的,加密後的版本出錯。再進一步對比發現,正確的加密dll參數未被混淆,而錯誤的加密dll參數如下:public DataTable GetMacIpInfo(string 001llll1010, string 0l1000ll1, string 011010ll)
4)最終在使用MaxtoCodeData Encryption Servicedll時,去掉參數混淆選項即可。
13、無法找到字型Arial //未解決
在System.Drawing.FontFamily.CreateFontFamily(string name, FontCollection fontCollection)
在System.Drawing.FontFamily..ctor(string name)
分析:1)使用者Client裡的英文很小,中文顯示正常。
2)奇怪的是,使用者C:\windows\Fonts裡已經有Arial字型了,安裝對應字型、複製到Fonts目錄後也無效。
3)在win7已安裝的字型,有些並未顯示,需要到Fonts裡右鍵點擊顯示。xp裡還需要對字型檔添加everyone讀取+讀取和運行許可權。
14、Dx匯出PDF時中文顯示為亂碼。
答:1)Dx預設字型是Tahoma,不支援中文,匯出時可以改用Arial Unicode MS。
2)但有些機器沒有預裝Arial Unicode MS字型,開啟匯出的PDF時中文會顯示為“This font is not yet supported”。手工安裝即可。也可以使用一些更常見的字型,比如仿宋、楷體等。
3)當然,也可以在匯出的時候,判斷使用者機器上是否存在某個字型,並把該字型嵌進去,保證在其他機器也能正常開啟。
15、此IP Address(0.1.0.4)不能登入系統。
答:安裝過網路攝影機、或者TV卡的機器上,會出現一個0.1.0.4的虛擬IP,拔出裝置或者登出重啟之後就沒了。ipconfig裡能看到:
Description:Microsoft TV/Video Connection
Physical Address:00-00-00-00-00-00
Autoconfiguration IP Address:0.1.0.4
Subnet Mask:255.255.255.255
需要在擷取到的IP列表裡過濾掉這種無效IP和IPv6的地址,或者針對內部應用,可以用Regex判斷IP的有效性。
16、對於某些大事務長時間運行時,會由於事務逾時引發異常:無效操作,串連被關閉。
答:這個問題詳見:這篇隨筆
17、雙擊ClickOnce更新程式時報“無法安裝或運行此應用程式,該應用程式要求首先在全域組件快取gac中安裝程式集system.identityModel 3.0.0.0”
答:ClickOnce的錯誤可以先去事件管理器裡看看,微軟的程式一般出錯了都會在事件->應用程式裡留下出錯資訊。
1)對於這個錯誤,報dll在gac裡找不到,去c:\windows\assembly裡確認一下,確實沒有,也可以用gacutil確認。於是把好的機器上的c:\windows\assembly目錄打包,用管理員權限覆蓋上去,能更新了。//有點暴力
2)但更新的過程中報錯:Faulting application client.exe, faulting module mscorwks.dll, version 2.0.50727.3620 | .net runtime verison 2.0.50727.3620 - 執行引擎錯誤,好的機器上mscorwks.dll的版本是2.0.50727.3634,用管理員權限替換即可。估計是xp sp3的補丁沒打上。
18、ClickOnce Your web browser settings do not allow you to run unsigned applications.
答:IE工具->Internet選項->進階->安全選項卡->勾上“允許運行或安裝軟體,即使簽名無效”
IE工具->Internet選項->安全->點擊“可信網站”->點“網站”->去掉“對該地區中所有網站要求伺服器驗證(https)”->輸入ClickOnce所在網站->點擊添加
19、NetUtil.GetMacAddresses出錯,ManagementClass拋出ManagementException,3類異常分別是“找不到”、“資料錯誤(迴圈冗餘檢查)。(異常來自HRESULT: 0x80070017)”、“拒絕訪問。(異常來自HRESULT 0x80070005 E_ACCESSDENIED)”。
答:1)第一類異常not found,在StackOverflow上找到一個文章,說wmi的repository啟動並執行過程中可能出錯,需要讓它自行重建。對於xp sp2的機器,輸入以下命令:rundll32 wbemupgd,UpgradeRepository。執行後在logs\setup.log裡報錯80041002,對象找不到(找不到類別、範例或屬性)。8004100E,命名空間找不到。再次嘗試,在管理員命令列裡,依次執行:net stop winmgmt->重新命名c:\windows\system32\wbem\Repository為Repo_bad之類的->net start winmgmt,這樣wmi會自行重建。
2)第二類異常資料錯誤,看起來是檔案CRC校正出錯,使用chkdsk C: /R在下次重啟時檢查檔案,或在重啟後,使用安裝盤裡的磁碟偵查工具把整個磁碟修複一下就OK了。
3)第三類拒絕訪問,看起來是許可權問題,對目錄c:\windows\system32\wbem添加everyone的修改許可權,重啟後OK。
4)另外還提到一套wmi diagnosis utility,看起來很強大,還沒試過。
20、client遇到問題需要關閉,我們對此引起的不便表示抱歉。
答:我們在Application.ThreadException和AppDomain.CurrentDomain.UnhandledException裡抓了所有未處理的異常,但這個問題並沒有被抓住,可以認為程式啟動時載入依賴項就發生錯誤了,但這是事後才想到的。
1)一開始遇到這個問題的第一反應,是去事件管理器裡看有無線索。但事件管理器裡只有faulting application client.exe, faulting module kernel32.dll, version 5.1.2600.5781, fault address 0x00012afb,事件ID=1000, 比較了一下使用者和我機器上的kernel32.dll、mscorlib.dll、mscorwks.dll這幾個經典dll,替換了版本不同的,開啟仍然出錯。
2)後來走上了偏路,看到stackoverflow上一個文章說可能資源被其他程式佔用或泄漏了,覺得有點道理:some app is stealing some global resources as ou experience trouble with other applications. App like notepad do not use much resources so appear to work fine, heavy apps are more likely to show up the trouble。於是查看工作管理員,發現我xp上38955個handles,win7上75211個handles, 但使用者機器上有259071個handles,把佔用控制代碼最多的幾個程式NTRtScan、VRVEDP_M、某個svchost,趨勢殺毒等殺掉之後,仍然報相同的錯誤。後來我想到,如果是資源不夠用,那多開幾個word+excel+ps+foxit pdf+video,如果沒問題,應該能去除這個可能性。
3)然後終於走上了正路,用sysinternals的ProcessExplorer產生client.exe的full dump檔案,安裝win7的symbols之後載入dump並分析,能得到比較詳細的堆棧資訊,能看到是在mscorwks擷取中繼資料時出錯然後調用kernel32拋異常的。
kernel32!RaiseException+0x52
mscorwks!GetMetaDataInternalInterface+0x84a9
mscorwks!CopyPDBs+0x39f8
mscorwks!LogHelp_LogAssert+0x5448
這裡其實已經指向了真正的問題所在,是載入dll的中繼資料時出錯,但是沒指出真正出錯的dll。
4)最後重啟用管理員登入,再dump出一個full.dmp,這次用windbg一分析(analyze -v),居然一目瞭然的指出“未能載入common.dll",一看使用者機器上出錯的dll只有260K,正常應該有3.25M,直接更新這個檔案即可。奇怪的是裡面明明是個net的異常System.BadImageFormatException,為什麼沒有以.net的異常拋出呢?呵呵
5)教訓是1》這次又是由於dll更新不完整造成的,只是更加隱藏,更新檔案的時候不加CRC或hash驗證真不行啊。2》似乎用域使用者權限dump出的資訊不全,還是要用管理員權限產生full dump。3》windbg確實比較牛,還是要認真學一學。
21、未能負載檔案或程式集DataWindowInterop, Version=2.0.6662.0或它的某一個依賴項,試圖載入格式不正確的程式
答:乍一看是個類似的問題,但更新這個dll仍然出錯,猜測是環境和os的問題,換一台win2003的機器是OK的。後來注意到使用者的系統是win7 x64位的,我們的client.exe依賴了DataWindowsInterop.dll。用Reflector開啟client和dwi,都是any cpu的。右鍵->屬性->相容性->用xp sp3相容模式運行client.exe,還是報同樣的錯誤。再把client用x86產生,再跑就OK了。這似乎說明client是以x64啟動並執行,並且希望找到dwi的x64位版本,而標識為any cpu的DataWindowsInterop其實是x86的,並不支援x64,所以格式並不正確。解決:要麼為使用者產生一個dwi64位的版本,要麼換一個32位的環境。
22、無效操作,串連被關閉。檢測到ContextSwitchDeadlock,Message:CLR無法從COM上下文0x1ad008轉換到COM上下文0x1ad178,這種狀態已持續60秒。擁有目標上下文/單元的線程很有可能執行的是非泵式等待或者在不發送windows訊息的情況下處理一個已耗用時間非常長的操作。這種情況通常會影響到效能,甚至可能導致應用程式不響應或者使用的記憶體隨時間不斷累積。要避免此問題,所有單一執行緒 Apartment(STA)線程都應使用泵式等待基元(如CoWaitForMultipleHandles),並在已耗用時間很長的操作過程中定期發送訊息。
答:這個錯誤本身是單一執行緒 Apartment執行時間過長導致的,怎麼解決方向不明確。後來跟蹤調試的時候發現有一段sql查詢很慢,涉及到一個1300萬資料量的表。查詢的時候,使用了一個手工添加的索引,去掉之後,查詢使用主、外鍵索引,速度快了之後也就沒報這個問題了。
23、多使用者終端伺服器上較容易出現磁碟空間不足造成client無法更新。
答:1)以本地管理員的許可權rd /s c:\$Recycle.Bin,因為很多年紀大的使用者只會del,不會shift+del
2)在磁碟清理裡,添加計劃任務:每周六早上1點做c盤清理
3)考慮在gpedit.msc中禁用資源回收筒,避免C盤空間的積累
24、本機無法串連遠端桌面+此系統的本地策略不允許您採用互動式登入
答:1)查看本機,發現系統屬性->遠程->遠端桌面是關閉的
2)登出換管理員帳號進去,發現這個選項是灰的。在services.msc裡啟動NetMeeting Remote Desktop Sharing服務,總也無法啟動
3)開啟gpedit.msc,電腦配置->系統管理範本->windows組件,發現沒有“終端服務”這一項。
4)右鍵系統管理範本->添加/刪除模板->添加,把所有.adm檔案都添加進去,就能看到“終端服務->允許使用者使用終端服務遠端連線“,選擇已啟用即可。
5)這時遠端桌面是開啟的,但串連時仍然報“此系統的本地策略不允許您採用互動式登入”
6)以管理員啟動管理工具->本地安全性原則(secpol.msc)->本地策略->使用者權利指派,“在本地登入”裡去掉Guest、Everyone之類的使用者和組,“通過終端服務允許登入”裡添加everyone、Remote Desktop Users,“通過終端服務拒絕登入”去掉everyone
25、IL格式不正確
答:似乎是MaxToCode加殼之後的util.dll在記憶體中去殼有問題,產生的dll不完整,引起IL格式不正確。未加殼的OK,用reactor加殼的也OK。用MaxToCode的最少選項加殼,還是不行。順便附上:
1)net reactor命令列加密的cmd: dotNET_Reactor.Console.exe -file client.dll -obfuscation 0 -targetfile d:\encrypted //注意最後不能有\,否則會報非法路徑
2)vss操作命令列:簽出:ss Checkout -C- -Yuser,pwd $/sln.root/sln/project/file.cs、撤銷簽出:ss Undocheckout -I-Y -Yuser,pwd $/sln.root/sln/project/file.cs、簽入:ss Checkin -Calex每日發布 -Yuser,pwd $/sln.root/sln/project/file.cs、新增檔案:ss Add -Calex新增檔案 -Yuser,pwd project/file.cs
26、對訊息GetUpdatePermissionRequest的本文進行序列化時出錯,無法產生臨時類(result=1) error CS2001 未能找到源檔案c:\windows\temp\x84cjsvg.0.cs
答:給c:\windows\temp賦everyone許可權即可。
27、只保留一個搜狗拼音中文IME+Dx8.2.6設定Numeric掩碼導致所有數字鍵敲擊1次輸入2次
答:數字鍵敲擊1次輸入2次,這個問題乍一看很怪,其實這類輸入的問題,多半和IME有些關係,之前也是搜狗拼音導致無法輸入,這回是連輸2次。測下來滿足以下2個條件,會出現這一問題:
1)在任意Dx8.2.6的TextEdit裡,設定了Numeric掩碼
2)使用者把所有IME全刪了,只保留搜狗拼音v6.2.0.7270。//之前那個導致DW下拉框出不來的是搜狗v4.3
一般來說,點擊輸入的控制項時,IME會自動關閉或切換到英文狀態,但這個使用者把所有IME全刪了,所以無法關閉也切不了英文,因此1次keyDown觸發了2次keyPress(鍵盤的keyPress和IME的keyPress)。解決辦法:1》保留預設英文IME;2》設定Control.ImeMode=Disable。關於微軟IME的架構,可以參考這篇博文。
28、Adobe flash player安裝出錯,報“無法註冊ActiveX控制項”
答:1)問題很明確,就是regsvr32 c:\windows\system32\Macromed\Flash\Flash32_14_0_0_125.ocx出錯,0x80070005
2)略微嘗試,發現原因也很明確,就是對HKCR\CLSID\{D27CDB6E-AE6D-11CF-96B8-444553540000}這一項沒有修改許可權。但恰恰就卡在這裡很久,不論是以本地管理員、還是網域系統管理員啟動regedit,都無法刪除+修改這一項。
3)反覆嘗試後發現,可如下擷取修改許可權:1》登出,以管理員身份登入,開啟regedit->找到這一項右鍵->許可權->進階->所有者->選擇當前登入人->勾中“替換子容器及對象的所有者”->點應用。2》必須刷一遍所有子項。即右鍵->許可權->進階->許可權頁->勾上“從父項繼承...”+“替代所有子物件...”這2個checkbox,就應用。3》對clsid節點也做上述操作,OK!
4)後來在其他使用者處也發現同樣的問題,但用上述方法試圖擷取clsid許可權時regedit總是閃退,查看事件管理器裡的報錯似乎指向一個叫ZFConnMonitor的進程,ModName:hookconnmonitor.dll,卸載這個程式,搞定!
29、通訊錯誤,iis服務端svc檔案無法訪問
答:1)問題本身不複雜,某個伺服器上的IIS不可訪問,http://localhost也無法訪問。
2)重啟網站、應用程式集區、IIS都不行。防火牆沒開,把連接埠改成8999之類的也不行。
3)注意到報錯日誌c:\windows\system32\LogFiles\W3SVC1兩天前就已經停止記錄了,同時c:\windows\system32\LogFiles\HTTPERR裡有最新記錄,開啟一看,全是*_Connections_Refused之類的報錯。
4)結合iis httperr connection_refused這幾個關鍵字一查,果然找到博文1和博文2,第一篇裡提到的解決方案就夠用了。原來是核心記憶體的非分頁落到了20MB(這個預設值怎麼這麼小?!)以下,解決方案是1》HKLM\system\CurrentControlSet\Services\HTTP\Parameters,建立dword:EnableAggressiveMemoryUsage=1;2》重啟http服務net stop http /y,然後iisreset /restart即可。博文2更深入,似乎是說http.sys和其他核心驅動一樣,共同使用核心記憶體,並提到一種方法可以找到是哪個驅動(c:\windows\system32\drivers\xx.sys)佔用過多記憶體,導致非分頁落到20M以下。連招如下:安裝win server 2003 sp2 32-bit support tools或從win server 2003 sp2.iso\support\tools\裡解壓得到->gflags.exe -k ptg,並重啟->poolmon.exe -b->strings * |findstr Leak->sigcheck myfault.sys,找到對應的驅動後,在硬體管理器裡卸載或禁用應該也OK的,但我沒試了。
30、EntityFramework啟用遷移並上線時,經常會報backing model has changed since database created, consider using code first migrations to update database
答:1)DatabaseInitializationStrategy_ModelMismatch:啟用了遷移,但__MigrationHistory裡最新的model和resx裡的model不匹配時會報這個錯。
2)DatabaseInitializationStrategy_MigrationsEnabledNoDrop:一旦啟用了遷移(EF.dll裡有MigrationConfiguration和DbMigraton,等價於啟用遷移),就不能通過DropCreateDatabaseAlways來更新DB了。
3)DatabaseInitializationStrategy_MigrationsEnabled:一旦啟用遷移,資料庫必須存在,否則報這個錯誤。
關於EF的若干操作和異常,可以另開N篇博文了。
31、ePass3000安裝後,ngSlotD服務無法啟動,報錯1053 服務沒有及時響應啟動或控制請求 或者 usb-key驅動安裝不上,總是報“需要重啟後完成卸載”
答:1)如何知道是否安裝成功?1》確保Smart Card(SCardSvr)服務已啟動,並且ngSlotD依賴於smart card服務;2》把ngslotd置為自動,並啟動;3》如果啟動出錯,嘗試刪除服務並重建。
2)有的時候ePass卸載不乾淨,重裝時總是報“需要重啟後完成卸載”。可參照這篇《ePass3000常見問題集》,經測試,關鍵是刪除c:\windows\temp臨時目錄中的InstallReboot檔案,再次安裝就不會彈框了。重啟機器,服務成功啟動。
3)遺留問題:使用者撤銷簽章時,會報“Access violation at address 06E117E7 in module ISCC72~1.ocx, write of address 0000180”的錯誤,並且導致IE掛掉,殺掉IE進程後再撤銷OK,但下次簽章再撤銷時仍會報錯。
4)服務常用命令:
sc start/delete ngSlotD
sc create/[config] ngSlotD binPath= "%ProgramFiles%\ngsrv\ngslotd.exe" start= auto depend= SCardSvr //obj= "NT Authority\LocalService" //也可用預設的system賬戶,但注意參數= 後面一定要加一個空格,這是什麼奇葩設定?!
ngSlotD -i(install service), -u(remove), -s(start), -t(stop), -v(display version), -h(display help)
epsng_certd -i(install monitor to auto-run list), -u(remove), -r(start), -a(hide mode, not show tray icon when run), -t(stop), -s(silent mode), -h(show usage)
32、通訊錯誤,伺服器未提供有意義的回複;這可能是由協定不匹配、會話過早關閉或內部伺服器錯誤引起的。
答:這是wcf服務參數或傳回值中帶有DataTable的典型錯誤,傳入、傳出的DataTable必須有名字,否則wcf序列化會報錯。wcf配置裡的啟用訊息日誌記錄+啟用跟蹤也可看到堆棧裡清楚的報出這個問題。
33、xp開機時顯示 BrStDvPt.exe無法定位程式輸入焦點GetProcessImageFileNameA於動態連結程式庫psapi.dll上
答:1)psapi.dll是windows下進程狀態的協助類(Process status helper),我機器上的版本是5.1.2600.5512。一般出現這個問題,是由於各種原因導致這個dll被修改了(比如被病毒修改替換、使用者誤刪除等),所以找不到裡面的函數入口。只要從其他正常的機器上把這個檔案拷貝覆蓋即可。
2)某些程式也依賴了這個檔案,比如我機器上DameWare的目錄裡也有psapi.dll,版本是4.0.1371.1,印表機驅動的安裝目錄(比如c:\program files\Brother Mfl-pro Suite)裡也依賴了這個檔案,用較新的版本覆蓋即可。
C/S端開發問題匯總