处理Silverlight onerror回调

问题描述:

Silverlight对象标签接受一个'onerror'参数,它会回调您选择的一段javascript。由Visual Studio模板生成的默认实现组装一个描述性消息并将其作为一个错误(例如,让IE显示一点警告三角形)。处理Silverlight onerror回调

在我看来,每次这个回调被激发时,我们的silverlight实例已经死了,你需要刷新页面。这是一个合理的扣除?

另一个问题是如何最好地处理这个回调。显示小警告图标有点像以开发人员为中心,并且它不允许我们(开发人员)在客户机器上运行时发现生产中实际发生的故障。人们在做什么?一对夫妇的我们自己的(或多或少具体的)想法是:

  • 通过一些暴露的端点

  • 删除隐藏Silverlight对象发送错误信息到服务器,展现出更好和更具描述消息给用户和一个'刷新'链接来再次启动silverlight页面(我们运行一个全尺寸的silverlight应用程序,所以如果silverlight对象不工作,客户不妨重新加载)

  • 以某种方式重新加载对象标签会自动避免客户执行任何操作以重新开始(可能是梳理)在给客户的一些通知中注明'系统'重启)

想法,想法,最佳实践,反模式?你们在做什么(除了确保Silverlight应用程序永远不会失败,但这是另一个讨论)?

我喜欢一个很好的错误报告形式使用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

我建议你改变你如何实例化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中,它非常简单,顺便说一句。