【茶包射手專欄】SSRS報表網頁列印失敗
【2008-10-24更新】關於此問題,已有新的研究心得。
同事回報,忽然發現SSRS(SQL Server Reporting Service)透過網頁直接列印的功能失效了,一直彈出"無法載入用戶端列印控制項"的錯誤訊息。
試了設為信任網站、刪除Windows\Downloaded Program Files\RSClientPrint Class、重開機等招式都無效。開啟Process Monitor,有看到一大串Registry查詢,但看不出所以然,又懶得抓個正常版來做個馬拉松式比對,今天決定換個戰略進攻...
利用Fiddler抓到SSRS傳回以下HTML內容,就是前述錯誤訊息的由來。
<OBJECT ID="RSClientPrint"
CLASSID="CLSID:FA91DF8D-53AB-455D-AB20-F2F023E498D3"
CODEBASE="/Reports/Reserved.ReportViewerWebControl.axd?
ReportSession=yiyl2jjxy5g0j55ra0vsvba&
ControlID=dec65406970b41ea8b6cde2445d3e4ab&
Culture=1028&UICulture=31748& ReportStack=1&
OpType=PrintCab# Version=2005,090,3042,00"
VIEWASTEXT></OBJECT>
<script language="javascript">
function Print()
{
if (typeof RSClientPrint.Print == "undefined")
{
alert("無法載入用戶端列印控制項。");
return;
}
在正常的情況下,當<OBJECT>指定的物件不存在時,應會透過CODEBASE位址自動下載安裝才對,但這台機器在手動刪除Windows\Downloaded Program Files\RSClientPrint Class後仍然未能重新安裝,而導致下方的Javascript檢查失敗。
我的推論是,可能這台機器殘存了某些設定,讓IE誤以為RSClientPrint元件是存在的,故未觸發自動安裝;但實際上元件又未完整註冊(檔案還被我們給砍了哩),搞得不上不下。
既然是ActiveX Control,就從Registry下手吧!
利用RegEdit尋找FA91DF8D-53AB-455D-AB20-F2F023E498D3,在HKCU\Software及HKLM\Software各找到一筆,先匯出備份後刪除:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{FA91DF8D-53AB-455D-AB20-F2F023E498D3}]
"Compatibility Flags"=dword:00000400
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Ext\Stats\
{FA91DF8D-53AB-455D-AB20-F2F023E498D3}]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Ext\Stats\
{FA91DF8D-53AB-455D-AB20-F2F023E498D3}\iexplore]
"Type"=dword:00000001
"Flags"=dword:00000000
"Count"=dword:00000025
"Time"=hex:d8,07,0a,00,01,00,0d,00,05,00,28,00,1c,00,02,00
將Registry刪除後,仍然無效。重開IE再試,就出現安裝控件的提示了。
問題排除,收工回家。
【2008-10-24更新】
發現刪除Registry只能暫時解決問題,依網友amoswu提供情資,此與KB956391 Hotfix有關,再Google了一下,網路有人找到解決方式了: http://www.dotnetgurus.net/post/2008/10/Reportviewer-Print-Problem-After-KB956391-(ActiveX-Kill-Bits-Update).aspx