如何在BeforeSendRequest中取消请求

时间:2013-05-22 16:15:33

标签: .net wcf iclientmessageinspector

使用IClientMessageInspector界面时,是否可以取消BeforeSendRequest方法的请求?无论如何,返回null都会发送请求。

 public object BeforeSendRequest(ref Message request, IClientChannel channel)
 {
    if(Condition)
    {
        return null; //I want cancel my send
    }
    else
    {
       return request;
    }
  }

2 个答案:

答案 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; }
}