我正试图沿着这些方向做点什么:
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
try
{
e.Handled = true;
var errorMessage = BuildErrorMessage(e.ExceptionObject);
var service = new MyService(Constants.MyBinding, Constants.MyServiceUri);
service.LogErrorAsync(errorMessage);
// wait awhile for the channel to flush its buffers, hard abort if it takes too long
//service.InnerChannel.Close(new TimeSpan(0, 0, 10));
}
finally
{
RestartSilverlightApp();
}
}
它起初工作 - 我有日志条目来证明它! - 但不可靠。调整的东西,现在我根本无法使它工作。服务器组件上的断点永远不会被击中; Fiddler表明客户端甚至从未在线路上发出HTTP请求。我尝试过的事情:
我不是Silverlight应用程序生命周期/体系结构的专家,也不是WCF的专家。我错过的想法?
答案 0 :(得分:1)
愚蠢的问题......如果您的应用程序崩溃了,为什么尝试像网络服务电话一样冒险?
我在这种场合通常会仔细阅读的策略是:
1.在IsoStore中记录未经处理的异常
2.重新启动应用程序
3.当应用程序启动时,它会检查IsoStore异常日志是否为空。如果它不是空的 - 尝试将它们发送到服务器记录器。
另外,鉴于您正在进行异步调用而不是重新启动应用程序,您基本上会遇到竞争条件。这很糟糕。 所以要么“冷日志”(我的原始建议)或等到异步调用返回/失败然后重新启动应用程序。
答案 1 :(得分:1)
所以我不认为你的问题是愚蠢的因为我必须尝试在Silverlight应用程序的生命周期的任何时刻记录异常。但是,我想知道,如果WCF可以通过原始AJAX样式POST替换为记录异常的服务。您可以将其绑定到浏览器并使用JavaScript引擎进行调用,而不是使用WebClient或Silverlight生态系统中的其他内容。