2013-05-22 33 views
7

Khi sử dụng giao diện IClientMessageInspector, tôi có thể hủy yêu cầu từ phương thức BeforeSendRequest không? Trả lại null cũng sẽ gửi yêu cầu.Cách hủy yêu cầu trong BeforeSendRequest

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

Bạn đã bao giờ giải quyết vấn đề này chưa? Tôi đang xem vấn đề tương tự và tôi không tìm thấy bất kỳ điều gì để hủy yêu cầu mà không gửi nội dung –

Trả lời

0

Bạn có thể hủy yêu cầu bằng phương pháp Abort của IClientChannel. Nhưng phương thức gửi của khách hàng của bạn ném CommunicationObjectAbortedException.

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

Có lẽ nhiều cách để xử lý tình huống này, nhưng tôi nghĩ rằng tất cả họ đều liên quan đến việc chỉ đơn giản là ném một ngoại lệ ra khỏi IClientMessageInspect.BeforeSendRequest của bạn để sớm chấm dứt hoạt động của khách hàng. Loại ngoại lệ bạn ném có thể khác nhau tùy thuộc vào ứng dụng tiêu thụ mong đợi trong kịch bản của bạn hoặc thứ gì đó bạn có thể bắt đầu ở một số nơi khác.

Trong trường hợp của tôi, tôi đã xây dựng một dịch vụ định tuyến/proxy WCF RESTful. IClientMessageInspect của tôi bắt buộc phải kiểm tra các thư gửi đi cho nhà cung cấp dịch vụ nhắn tin của chúng tôi và không cho phép gửi thư đến API dịch vụ của nhà cung cấp trừ khi số điện thoại đi được "trắng được liệt kê" trong dịch vụ định tuyến proxy/định tuyến 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; 
} 

Trường hợp RouterServiceFault là một lớp đơn giản, tôi có thể chuyển lại thư để hiển thị/đăng nhập vào ứng dụng tiêu thụ.

[ServiceContract] 
public class RouterServiceFault 
{ 
    [DataMember] 
    public string Message { get; set; } 
} 
Các vấn đề liên quan