2013-05-22 1 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에서 예외를 던지는 것을 포함 생각합니다. throw하는 예외의 유형은 시나리오에서 소비하는 응용 프로그램이 기대하는 것 또는 다른 곳에서 업스트림을 catch 할 수있는 대상에 따라 다를 수 있습니다.

내 경우에는 WCF RESTful 프록시/라우팅 서비스를 구축하고있었습니다. 내 IClientMessageInspect는 문자 메시지 공급 업체의 발신 메시지를 검사하고 라우터 프록시/라우팅 서비스에서 아웃 바운드 전화 번호가 "흰색으로 나열"되어 있지 않으면 발신 메시지가 공급 업체의 서비스 API로 전송되지 않도록해야했습니다.

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