处理Silverlight onerror回调

时间:2009-06-08 07:15:40

标签: silverlight error-handling

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

在我看来,每次触发此回调时,我们的silverlight实例都已死,您需要刷新页面。这是一个合理的推论吗?

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

  • 通过一些公开的端点

  • 将错误消息发送回服务器
  • 删除隐藏silverlight对象,向用户显示更好,更具描述性的消息,并再次启动“刷新”链接以启动Silverlight页面(我们运行全尺寸的Silverlight应用程序,如果silverlight对象不是“无论如何,客户也可以重装”

  • 以某种方式自动重新加载对象标签,以避免客户执行任何操作再次开始(可能会与客户发出“系统重新启动”的通知)。

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

2 个答案:

答案 0 :(得分:3)

我喜欢以“表单”的形式使用SilverlightFX获取源http://github.com/NikhilK/silverlightfx/tree/master的一个很好的错误报告,检查它非常酷的框架否则基本上只是一个错误的摘要,发送它的能力通过上传电子邮件支持和“oops we goofed”标题:)我用这种方式处理所有未处理的开发,还有一篇关于使用字典按类型处理错误的好文章 http://www.netfxharmonics.com/2009/04/Exception-Handlers-for-Silverlight-20也是我的最爱 。希望这有帮助

答案 1 :(得分:2)

我建议您更改实例化Silverlight控件的方式。您可以在Silverlight.js文件中调用Silverlight.CreateObjectEx(),而不是使用object标记。对于您的场景,这可能更自然一些。如果失败,您可以再次调用它,这比尝试重新加载对象标记更简单。例如:

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中非常简单,顺便说一句。