どんなに頑張っても、Silverlight で WCF の障害を処理できないようです。実際、エラーはサーバーから離れないようです。
たとえば、デバッグすると、処理されなかったと言って FaultException をスローする行で停止します。
[SilverlightFaultBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class StoreService : IStoreContract
{
public System.Collections.Generic.List<string> GetStoreDesignNames()
{
try
{
StoreDataContext swdc = new StoreDataContext();
var query = from storeDesign in swdc.StoreDesignDBs select storeDesign.Name;
return query.ToList();
}
catch (System.Data.SqlClient.SqlException sqlExcept)
{
throw new FaultException<SqlFault>(new SqlFault() { Message = sqlExcept.Message });
}
}
}
このメソッドを実装するクラスは、コントラクト インターフェイスから派生します。
[ServiceContract(Namespace = "Store")]
public interface IStoreContract
{
/// <summary>
/// Obtain the list of store design names.
/// </summary>
[OperationContract,
FaultContract(typeof(SqlFault))]
List<String> GetStoreDesignNames();
}
SqlFault クラスは次のように定義されます。
public class SqlFault
{
public String Message { get; set; }
}
クライアント側では、次のようにエラーを処理します。
// swc is the client
swc.GetStoreDesignNamesCompleted += new EventHandler<ServiceReference.GetStoreDesignNamesCompletedEventArgs>((obj, evt) =>
{
if (evt.Error == null)
{
// In case of success
MessageBox.Show(evt.Result.First());
}
else if (evt.Error is FaultException<ServiceReference.SqlFault>)
{
FaultException<ServiceReference.SqlFault> fault = evt.Error as FaultException<ServiceReference.SqlFault>;
Dispatcher.BeginInvoke(() =>
{
ErrorWindow ew = new ErrorWindow(fault.Detail.Message, "No details");
ew.Show();
});
}
});
swc.GetStoreDesignNamesAsync();
インターフェイスに [SilverlightFaultBehavior] 属性を設定しようとしましたが、役に立ちませんでした。インターフェイスがなくても、このエラーが発生します。
ここで説明されているように、web.config で動作拡張を使用しようとしましたが、拡張が無効であるという警告が表示されます。
Siverlight で WCF 障害を適切に処理するにはどうすればよいですか? 前もって感謝します。