2013-05-22 12 views
7

Podczas korzystania z interfejsu IClientMessageInspector, czy mogę anulować żądanie z metody BeforeSendRequest? Zwracanie null wysyła mimo to żądanie.Jak anulować żądanie w BeforeSendRequest

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

Czy kiedykolwiek to rozwiązałeś? Patrzę na ten sam problem i nie znajduję niczego, aby anulować wniosek bez wysyłania treści –

Odpowiedz

0

Możesz anulować żądanie za pomocą metody Aborta IClientChannel. Ale metoda wysyłkowa twojego klienta rzuca CommunicationObjectAbortedException.

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

Prawdopodobnie istnieje wiele sposobów, aby obsługiwać ten scenariusz, ale myślę, że wszystkie one dotyczą po prostu rzuca wyjątek ze swojego IClientMessageInspect.BeforeSendRequest do przedwczesnego zakończenia operacji klienta. Typ zgłaszanego wyjątku prawdopodobnie różni się w zależności od tego, co aplikacja zużywa w swoim scenariuszu, lub czegoś, co można złapać w górę strumienia, gdzie indziej.

W moim przypadku budowałem usługę proxy/routing WCF RESTful. Moja usługa IClientMessageInspect była wymagana do sprawdzania wychodzących wiadomości wysyłanych do naszego dostawcy usług tekstowych i nie zezwalała na wysyłanie wiadomości wychodzącej do interfejsu API dostawcy dostawcy, chyba że numer telefonu wychodzącego był "biały na liście" w usłudze proxy routera/routingu 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; 
} 

Gdzie RouterServiceFault jest prostą klasą I może przekazać wiadomość z powrotem do wyświetlania/logowania aplikacji zużywających.

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