使用IClientMessageInspector
界面时,是否可以取消BeforeSendRequest
方法的请求?无论如何,返回null
都会发送请求。
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
if(Condition)
{
return null; //I want cancel my send
}
else
{
return request;
}
}
答案 0 :(得分:0)
您可以使用IClientChannel的Abort方法取消请求。但是客户端的调度方法抛出 CommunicationObjectAbortedException 。
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
if(Condition)
{
channel.Abort();
return null;
}
else
{
return request;
}
}
答案 1 :(得分:0)
可能有多种方法可以处理这种情况,但我认为它们都只涉及从IClientMessageInspect.BeforeSendRequest中抛出异常以过早地结束客户端操作。您抛出的异常类型可能会有所不同,具体取决于消费应用程序在您的方案中所期望的内容,或者您可以在其他地方捕获的内容。
就我而言,我正在构建一个WCF RESTful代理/路由服务。我的IClientMessageInspect需要检查绑定给我们的短信供应商的外发邮件,并且不允许将外发邮件发送到供应商的服务API,除非出站电话号码是"白名单"在路由器代理/路由服务web.config
中public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
if (!WhiteList.IsWhiteListed(outboundNumber))
{
throw new WebFaultException<RouterServiceFault>(new RouterServiceFault {Message = $"Phone number {outboundNumber} is not white listed." }, HttpStatusCode.Forbidden);
}
// Save the routed to service request address so we can see it after receive reply (in correlationState)
return request.Headers.To;
}
如果RouterServiceFault是一个简单的类,我可以将消息传回来以显示/登录消费应用程序。
[ServiceContract]
public class RouterServiceFault
{
[DataMember]
public string Message { get; set; }
}