2013-05-22 6 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のAbortメソッドでリクエストをキャンセルできます。しかし、クライアントのディスパッチメソッドは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に送信することを拒否する必要がありました。

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; } 
} 
関連する問題