2009-06-08 70 views
3

Silverlight對象標籤接受一個'onerror'參數,它會回調您選擇的一段javascript。由Visual Studio模板生成的默認實現組裝一個描述性消息並將其作爲一個錯誤(例如,讓IE顯示一點警告三角形)。處理Silverlight onerror回調

在我看來,每次這個回調被激發時,我們的silverlight實例已經死了,你需要刷新頁面。這是一個合理的扣除?

另一個問題是如何最好地處理這個回調。顯示小警告圖標有點像以開發人員爲中心,並且它不允許我們(開發人員)在客戶機器上運行時發現生產中實際發生的故障。人們在做什麼?一對夫婦的我們自己的(或多或少具體的)想法是:

  • 通過一些暴露的端點

  • 刪除隱藏Silverlight對象發送錯誤信息到服務器,展現出更好和更具描述消息給用戶和一個'刷新'鏈接來再次啓動silverlight頁面(我們運行一個全尺寸的silverlight應用程序,所以如果silverlight對象不工作,客戶不妨重新加載)

  • 以某種方式重新加載對象標籤會自動避免客戶執行任何操作以重新開始(可能是梳理)在給客戶的一些通知中註明'系統'重啓)

想法,想法,最佳實踐,反模式?你們在做什麼(除了確保Silverlight應用程序永遠不會失敗,但這是另一個討論)?

回答

3

我喜歡一個很好的錯誤報告形式使用SilverlightFX的「表格」抓住源http://github.com/NikhilK/silverlightfx/tree/master,檢查出非常酷的框架,否則基本上只是一個錯誤的總結,通過上傳發送它的能力電子郵件支持和「哎呀我們瘋狂」稱號:)我處理所有未處理的預期這種方式,還有一個很好的文章處理錯誤類型使用字典 http://www.netfxharmonics.com/2009/04/Exception-Handlers-for-Silverlight-20也是我的最愛 。希望這有幫助

+0

絕對通過這兩個鏈接讀取 - 但也有你(soren)通過'App.xaml.cs'代碼本身讀取*異常從Silverlight到氣泡DOM/Javascript?特別是Application_UnhandledException和ReportErrorToDOM的默認實現。微軟提供的代碼(和評論)也可能給你一些想法。 – Conceptdev 2009-06-08 10:01:09

+0

Markin這是作爲好的鏈接的答案,但肯定檢查埃裏克Morks答案下面,我喜歡他提到的可重啓silverlight的東西 – 2009-06-11 20:54:00

2

我建議你改變你如何實例化Silverlight控件。您可以在Silverlight.js文件中調用Silverlight.CreateObjectEx(),而不使用對象標記。這對您的情況可能更自然一些。如果失敗,可以再次調用它,這比嘗試重新加載對象標籤更簡單。例如:

Silverlight.createObjectEx(
    { 
     source: '/../VideoPlayer.xap', 
     parentElement: document.getElementById('movieplayerDiv'), 
     id: 'VideoPlayer', 
     properties: { 
      width: '100%', 
      height: '100%', 
      background: '#FFd9e3d7', 
      inplaceInstallPrompt: false, 
      isWindowless: 'false', 
      version: '2.0' 
     }, 
     events: { 
      onError: onSLError, 
      onLoad: onSLLoad 
     }, 

     initParams: "...", 
     context: null 
    }); 



    function onSLLoad(sender, args) { 

    } 

    function onSLError(sender, args) { 
     //    alert('error'); 
    } 

其他的想法:

  • 如果您的JavaScript錯誤處理程序火災,實例化失敗。 Silverlight不會突然回到生活本身。相反,調用CreateObjectEx再給它一次;)
  • 在Silverlight中有兩種終端錯誤。 1)管理錯誤(點擊管理的Application_UnhandledException方法)。請注意,有些錯誤甚至可能沒有達到這一點。如果由於某種原因無法加載受管基礎架構(內存不足錯誤......),則不會出現這種錯誤。不過,如果你能得到它,你可以使用Web服務(或CLOG項目)將其傳回服務器。 2)Javascript錯誤。這些是你現在得到的。我建議使用JQuery(或首選的Javascript庫)將這些彈回到您的服務器。喜歡的東西:

    $.post(this.href, { func: "countVote" }, 
    

    功能(數據){...} 你怎麼處理這個服務器上,當然,取決於你的服務器堆棧是什麼樣子。在MVC中,它非常簡單,順便說一句。