对于silverlight3.0 我们可以用WCF来进行通信,但是如果service发生错误,它将响应Http500错误使我们不能访问silverlight客户端,所以我们不得不 在service端进行try {} catch...,添加额外属性(Property) 如: public string exception {get;set;}操作。
下面的方法介绍不使用try ...直接把错误的消息返回到silverlight客户端, 配置WCF Falut来用于silverlight 客户端
1.定义WCF endpoint behavior
public
class
SilverlightFaultBehavior : BehaviorExtensionElement, IEndpointBehavior
{
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
SilverlightFaultMessageInspector inspector = new SilverlightFaultMessageInspector();
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
}
public class SilverlightFaultMessageInspector : IDispatchMessageInspector
{
public void BeforeSendReply( ref Message reply, object correlationState)
{
if (reply.IsFault)
{
HttpResponseMessageProperty property = new HttpResponseMessageProperty();
// Here the response code is changed to 200.
property.StatusCode = System.Net.HttpStatusCode.OK;
reply.Properties[HttpResponseMessageProperty.Name] = property;
}
}
public object AfterReceiveRequest( ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
// Do nothing to the incoming message.
return null ;
}
}
// The following methods are stubs and not relevant.
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
public override System.Type BehaviorType
{
get { return typeof (SilverlightFaultBehavior); }
}
protected override object CreateBehavior()
{
return new SilverlightFaultBehavior();
}
}
{
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
SilverlightFaultMessageInspector inspector = new SilverlightFaultMessageInspector();
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
}
public class SilverlightFaultMessageInspector : IDispatchMessageInspector
{
public void BeforeSendReply( ref Message reply, object correlationState)
{
if (reply.IsFault)
{
HttpResponseMessageProperty property = new HttpResponseMessageProperty();
// Here the response code is changed to 200.
property.StatusCode = System.Net.HttpStatusCode.OK;
reply.Properties[HttpResponseMessageProperty.Name] = property;
}
}
public object AfterReceiveRequest( ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
// Do nothing to the incoming message.
return null ;
}
}
// The following methods are stubs and not relevant.
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
public override System.Type BehaviorType
{
get { return typeof (SilverlightFaultBehavior); }
}
protected override object CreateBehavior()
{
return new SilverlightFaultBehavior();
}
}
这个WCF endpoint behavior需要在WCF service 文件(web.config)配置才能起到作用。
2.配置Web.config
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
<
system.serviceModel
>
< extensions >
< behaviorExtensions >
< add name =”silverlightFaults”
type =”Microsoft.Silverlight.Samples.SilverlightFaultBehavior,
SilverlightFaultBehavior,
Version =1.0.0.0,
Culture =neutral,
PublicKeyToken =null”/>
</behaviorExtensions >
</ extensions >
< behaviors >
< endpointBehaviors >
< behavior name =”SilverlightFaultBehavior”>
<silverlightFaults />
</ behavior >
</ endpointBehaviors >
</ behaviors >
< services >
< service name =”Calculator.Web.Service”>
<endpoint address =””
binding =”basicHttpBinding”
contract =”Calculator.Web.Service”
behaviorConfiguration =”SilverlightFaultBehavior” />
</ service >
</ services >
</ system.serviceModel >
< extensions >
< behaviorExtensions >
< add name =”silverlightFaults”
type =”Microsoft.Silverlight.Samples.SilverlightFaultBehavior,
SilverlightFaultBehavior,
Version =1.0.0.0,
Culture =neutral,
PublicKeyToken =null”/>
</behaviorExtensions >
</ extensions >
< behaviors >
< endpointBehaviors >
< behavior name =”SilverlightFaultBehavior”>
<silverlightFaults />
</ behavior >
</ endpointBehaviors >
</ behaviors >
< services >
< service name =”Calculator.Web.Service”>
<endpoint address =””
binding =”basicHttpBinding”
contract =”Calculator.Web.Service”
behaviorConfiguration =”SilverlightFaultBehavior” />
</ service >
</ services >
</ system.serviceModel >
重要的一点是要在 serviceBehaviors 节点behavior下添加<serviceDebug includeExceptionDetailInFaults="true" />
3.Silverlight客户端处理
当异步请求Complected后,这个故障信息 可以被处理:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
void
proxy_CalculateCompleted(
object
sender, CalculateCompletedEventArgs e)
{
if (e.Error == null )
{
// In case of success
}
else if (e.Error is FaultException < ExceptionDetail > )
{
FaultException < ExceptionDetail > fault = e.Error as FaultException < ExceptionDetail > ;
// fault.Detail.Type contains server exception type
// fault.Detail.Message contains server exception message
// fault.Detail.StackTrace contains servier stack trace
}
}
{
if (e.Error == null )
{
// In case of success
}
else if (e.Error is FaultException < ExceptionDetail > )
{
FaultException < ExceptionDetail > fault = e.Error as FaultException < ExceptionDetail > ;
// fault.Detail.Type contains server exception type
// fault.Detail.Message contains server exception message
// fault.Detail.StackTrace contains servier stack trace
}
}
参考文章:MSDN