如何在beforeendrequest中取消请求



使用IClientMessageInspector接口时,可以取消来自BeforeSendRequest方法的请求吗?返回null将发送请求。

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

您可以使用IClientChannel的Abort方法取消请求。但是客户端的调度方法会抛出CommunicationObjectAbortedException

public object BeforeSendRequest(ref Message request, IClientChannel channel)
 {
    if(Condition)
    {
        channel.Abort();
        return null;
    }
    else
    {
       return request;
    }
  }

可能有多种方法来处理这种情况,但我认为它们都涉及简单地抛出一个异常从你的IClientMessageInspect。beforeendrequest提前结束客户端操作。你抛出的异常类型可能会有所不同,这取决于消费应用程序在你的场景中期望什么,或者你可以在上游的其他地方捕捉到什么。

在我的例子中,我正在构建一个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是一个简单的类,我可以传入一条消息,让它在消费应用中显示/log。

[ServiceContract]
public class RouterServiceFault
{
    [DataMember]
    public string Message { get; set; }
}

相关内容

  • 没有找到相关文章

最新更新