我試圖做的東西沿着這些路線:可能從Silverlight的全局UnhandledException處理程序調用WCF服務?
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()的調用。 [如果異常處理程序中的某些事情阻止了創建 - >打開的WCF通道轉換]
- Made 服務 App類的成員並在我的Application_Startup處理程序中初始化它。 [上的理論,我用它來生成WCF代理輔助類被解開的Silverlight應用程序域的全局異常處理的點的時間拆除/在某種狀態不好的]
- 製造服務靜態的。 [在理論上,這是不是應用程序的同一實例,使服務是GC'd]
- 證實service.State,service.EndPoint,和任何其他公共屬性,我可以快速檢查在異步調用之前,在調試器中正確無誤。
- 已驗證服務的創建,異步調用和同步打開/關閉調用都發生在主(UI)線程上,並且線程ID是常量[在我之前沒有部分/「隱形」拆卸處理程序被調用]。
- 將請求移至service.LogErrorAsync()以外的Application_UnhandledException。 [如果事情在其他地方配置錯誤]它完美無瑕。
我不是Silverlight應用程序生命週期/體系結構中的專家,也不是WCF。我錯過的想法?
我希望有一種方法可以在Silverlight中進行同步調用,但是沒有。你甚至不能使用ManualResetEvent.WaitOne()來僞造它 - 在UI線程上調用服務完成處理程序,所以你會死鎖。調用Close()是我所知道的最好的解決方法。 /////我很喜歡ISO的想法。這可能是我會用...希望我們不需要記錄任何IsolatedStorageExceptions :) – 2009-12-17 23:58:46
是的,如果用戶有意將您的IsoStore配額更改爲0MB,您可能實際上會收到IsoStore異常。所以在寫入IsoStore之前,請檢查您是否有合理的(5kb?)存儲空間。 – JustinAngel 2009-12-18 00:03:07