如何在 BeforeSendRequest 中取消请求

Posted

技术标签:

【中文标题】如何在 BeforeSendRequest 中取消请求【英文标题】:How to cancel a request in BeforeSendRequest 【发布时间】:2013-05-17 19:10:33 【问题描述】:

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

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

【问题讨论】:

你解决过这个问题吗?我正在查看同样的问题,但我没有找到任何可以取消请求而不发送正文的内容 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

可能有多种方法可以处理这种情况,但我认为它们都涉及简单地从 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; 

【讨论】:

以上是关于如何在 BeforeSendRequest 中取消请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 4+ 中取消/取消订阅所有挂起的 HTTP 请求

在word中如何取消突出标记

Flutter中如何取消任务

chrome如何取消自动升级

如何在 AngularJS 中取消 $http 请求?

我如何在反应中取消订阅