2013-05-22 4 views
7

При использовании интерфейса IClientMessageInspector я могу отменить запрос от метода BeforeSendRequest? Возвращение null все равно отправляет запрос.Как отменить запрос в BeforeSendRequest

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

Вы когда-нибудь это решали? Я смотрю на ту же проблему, и я не нахожу ничего, чтобы отменить запрос без отправки тела –

ответ

0

Вы можете отменить запрос с помощью метода прерывания IClientChannel. Но метод отправки вашего клиента выдает CommunicationObjectAbortedException.

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

Есть, вероятно, несколько способов справиться с таким сценарием, но я думаю, что все они вовлекают просто бросать исключение из вашего IClientMessageInspect.BeforeSendRequest преждевременно закончить операцию клиента. Тип исключения, который вы бросаете, может варьироваться в зависимости от того, что ожидает потребительское приложение в вашем сценарии, или что-то, что вы можете поймать вверх по течению где-то еще.

В моем случае я создавал службу прокси/маршрутизации WCF RESTful. Мой IClientMessageInspect должен был проверять исходящие сообщения, привязанные к нашему поставщику текстовых сообщений, и не разрешать отправку исходящего сообщения в API-интерфейс поставщика, если номер исходящего телефона не был «указан в белом списке» в службе прокси-маршрутизатора маршрутизатора. Web-адрес

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; } 
} 
Смежные вопросы