我对Silverlight有点新,我想知道如何处理WCF服务的故障/处置。
我习惯了这样的事情(wcf abort/close pattern)你在try / catch中调用服务(确保你关闭或中止)。 (在无状态应用程序中运行良好)
调查Silverlight,我们在哪里应用中止/关闭模式?因为服务调用是异步的,应用程序已满状态。
目前,我唯一能想到的是某种动态代理(使用类似Castle DP的东西)以及n-tier app, about 1/2 way down the page示例中的ChannelFactoryManager。代理将确保始终存在开放通道,ChannelFactoryManager将处理故障
答案 0 :(得分:1)
由于Silverlight网络环境的异步特性,我建议您构建更多可测试的ServiceAgent - 围绕Silverlight客户端代理的长期单独包装器,并提供服务方法的回调。您可以在调用服务方法或使用通道故障事件之前检查实际代理状态(并在需要时重新创建)。例如:
public void GetOptionsAsync(Action<GetOptionsCompletedEventArgs> callback)
{
try
{
CheckProxy();
EventHandler<GetOptionsCompletedEventArgs> handler = null;
handler = (sender, args) =>
{
Proxy.GetOptionsCompleted -= handler;
if (args.Error != null)
{
//...
}
if (callback != null)
{
callback(args);
}
};
Proxy.GetOptionsCompleted += handler;
Proxy.GetOptionsAsync();
}
catch (Exception unknownException)
{
//...
throw;
}
}
public override void ResetProxy() //AbortProxy/CloseProxy
{
if (Proxy != null)
{
try
{
Proxy.CloseProxy(); //extension method to handle exception while closing
}
catch (Exception unknownException) //CommunicationObjectFaultedException
{
//...
Proxy.Abort();
}
}
CreateProxy();
}
public override void CheckProxy()
{
if (Proxy == null || (Proxy.State != CommunicationState.Opened && Proxy.State != CommunicationState.Created))
{
ResetProxy();
}
}
public override void CreateProxy() //RecreateProxy
{
Proxy = new WcfClient();
Proxy.InnerChannel.Faulted += OnChannelFaulted;
}
答案 1 :(得分:1)
使用Castle DP和ChannelFactoryManager实现并详细说明的解决方案:
http://www.codeproject.com/Articles/502121/WCF-in-a-stateful-application-WPF-Silverlight