2009-12-17 56 views
1

我試圖做的東西沿着這些路線:可能從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.Stateservice.EndPoint,和任何其他公共屬性,我可以快速檢查在異步調用之前,在調試器中正確無誤。
  • 已驗證服務的創建,異步調用和同步打開/關閉調用都發生在主(UI)線程上,並且線程ID是常量[在我之前沒有部分/「隱形」拆卸處理程序被調用]。
  • 將請求移至service.LogErrorAsync()以外的Application_UnhandledException。 [如果事情在其他地方配置錯誤]它完美無瑕。

我不是Silverlight應用程序生命週期/體系結構中的專家,也不是WCF。我錯過的想法?

回答

1

愚蠢的問題......如果你的應用程序崩潰,爲什麼嘗試一些冒險的web服務調用?

我在這種情況下通常仔細閱讀的策略是:
1.在IsoStore中記錄unhandeled異常。
2.重新啓動應用程序。
3.當應用程序啓動時,它檢查IsoStore異常日誌是否爲空。如果它不是空的 - 嘗試將它們發送到服務器記錄器。

另外,考慮到你正在做一個異步調用,而不是重新啓動應用程序,你基本上已經有了一個競爭條件。這是不好的。 因此,無論是「冷日誌」(我的原始建議)或等到異步調用返回/失敗,然後重新啓動應用程序。

+0

我希望有一種方法可以在Silverlight中進行同步調用,但是沒有。你甚至不能使用ManualResetEvent.WaitOne()來僞造它 - 在UI線程上調用服務完成處理程序,所以你會死鎖。調用Close()是我所知道的最好的解決方法。 /////我很喜歡ISO的想法。這可能是我會用...希望我們不需要記錄任何IsolatedStorageExceptions :) – 2009-12-17 23:58:46

+0

是的,如果用戶有意將您的IsoStore配額更改爲0MB,您可能實際上會收到IsoStore異常。所以在寫入IsoStore之前,請檢查您是否有合理的(5kb?)存儲空間。 – JustinAngel 2009-12-18 00:03:07

1

所以我不認爲你的問題是愚蠢的因爲我必須嘗試在Silverlight應用程序生命週期的任何點上記錄異常。不過,我想知道,如果WCF可以在這裏用一個原始的AJAX樣式的POST替代記錄您異常的服務。您可以將其綁定到瀏覽器,並使用JavaScript引擎進行調用,而不是使用WebClient或Silverlight生態系統中的其他內容。

+0

好主意 - 但我和Justin一起去了,因爲它更容易實現。 – 2009-12-18 01:51:40

相關問題