Run into this thread on stackoverflow about handling fault in asynchronous call.
- In normal .NET code, the generated proxy class handles the exception properly by putting the exception in the Error property instead of throwing it.
- In Silverlight, the generated proxy class sets the Error property, but does not handle the exception completely. The exception is picked up by the debugger, which pops up the exception box with the message “ProtocolException was unhandled by user code”. Despite this message, the exception does not seem to actually make it to the Application_UnhandledException function.
In my opinion, Silverlight is running within browser, in theory, it should rely on browser to handle all the exceptions, similar to javascript and flash. Asynchronous call makes this fault handling more complex, putting regular try catch block on the primary call doesn’t work, Microsoft doesn’t add try catch block in OnComplete method in generated proxy.cs either.
Instead customize proxy generation wizard, we use a pipeline pattern to introduce a extra layer between silver light and wcf proxy.
This pipe line (wrapper) class is replacing the original WCF proxy inject into SL view model, in it’s ctor the new complete event handler will be appended after the one with the same name in proxy.
General Exception handling is happening in CheckError() method.
Here are some example code:
public MySilverLightViewModel(IMySilverLightDataService dataService) { // Hookup DataAccess Completed Events _dataService = dataService; _dataService.DataServiceCallCompleted += (s, e) => { IsBusy = false; // used by UI control to display the spinner if (e.Error.GetType() == typeof (FaultException<TooManyRecordsFault>)) // deal with FaultContract defined in OperationContract { DialogueService.ShowAlert(e.Error.Message); // Our own message box service return; } if (_dataService.ErrorCheck(e)) return; // general unhandled exception happend in ErrorCheck, stop call if occurs. // processing data ... };
Maybe we will re-visit this after we got chance to look into RIA service.