【发布时间】:2010-12-27 20:48:58
【问题描述】:
我正在尝试按照以下方式做一些事情:
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 请求。我尝试过的事情:
- 插入了对 Close() 的调用,即使超时时间很长。 [理论上应用程序在通道可以做它的事情之前重新启动] 结果:应用程序总是挂起,直到超时到期。我发现这很有趣——当 WCF 正常运行时,Close() 几乎立即返回。
- 在 Application_Startup 中插入了对 service.InnerChannel.Open() 的调用。 [如果异常处理程序中我们的状态阻止了 Created -> Opened WCF 通道转换]
- 使 service 成为 App 类的成员,并在我的 Application_Startup 处理程序中对其进行初始化。 [理论上,当 Silverlight 将 AppDomain 解开到全局异常处理程序的位置时,我用来生成 WCF 代理的帮助程序类已被拆除/处于某种不良状态]
- 将服务设为静态。 [理论上这不是同一个 App 实例,允许 service 被 GC'd]
- 在异步调用之前验证了 service.State、service.EndPoint 以及我可以在调试器中快速检查的任何其他公共属性是否正确。李>
- 已验证 服务 的创建、异步调用和同步打开/关闭调用都发生在主 (UI) 线程上,并且线程 ID 是恒定的 [no partial/"stealth " 在我的处理程序被调用之前的拆解]。
- 将调用移至 Application_UnhandledException 之外的 service.LogErrorAsync()。 [以防其他地方配置错误]它完美无缺。
我不是 Silverlight 应用程序生命周期/架构方面的专家,也不是 WCF。我错过的想法?
【问题讨论】:
标签: wcf silverlight exception-handling