2010-12-17 31 views
5

Có cách nào kiểm tra cuộc gọi phương thức wcf không. Tôi có nghĩa là bất cứ điều gì bằng HttpModule trong asp.net.Hooking vào đường ống wcf

Tôi muốn thực hiện một phương thức trước bất kỳ cuộc gọi phương thức nào.

Trả lời

7

WCF có kiến ​​trúc rất mở rộng. Nó có thể đánh chặn và tùy chỉnh rất nhiều chức năng WCF để làm điều của riêng bạn.

Trong trường hợp của bạn, bạn sẽ phải viết Dịch vụ thích hợp hoặc Hành vi điểm cuối. Quá trình nhận tin nhắn từ các kênh truyền tải và gọi phương thức dịch vụ của bạn được gọi là gửi đi. WCF sử dụng một tập các Hành vi để thực hiện việc điều phối. Bạn có thể cung cấp Hành vi của riêng bạn để kiểm tra các cuộc gọi phương thức.

Bài viết này cung cấp một cái nhìn tổng quan tuyệt vời và các ví dụ - http://msdn.microsoft.com/en-us/magazine/cc163302.aspx

Tôi cũng xin đề nghị bạn nên đi qua WCF này kiến ​​trúc tổng quan http://msdn.microsoft.com/en-us/library/aa480210.aspx

+2

Liên kết đầu tiên bị hỏng. –

0

Nó phụ thuộc những gì bạn muốn kiểm tra hoặc sửa đổi trong thông báo ở cấp độ nào. Nếu bạn muốn sửa đổi một cái gì đó ở mức mã hóa, bạn có thể chọn cho bộ mã hóa tin nhắn tùy chỉnh, nếu nó trước khi yêu cầu được deserialize hoặc trước khi gửi trả lời cho khách hàng, sử dụng tùy chỉnh thông báo thanh tra.

HTH.

0

Các IOperationInvoker có thể có được những gì bạn đang tìm kiếm:

public class MyOperationInvoker : IOperationInvoker 
{ 
    IOperationInvoker originalInvoker; 
    public MyOperationInvoker(IOperationInvoker originalInvoker) 
    { 
     this.originalInvoker = originalInvoker; 
    } 

    public bool IsSynchronous { get { return originalInvoker.IsSynchronous; } } 

    public object[] AllocateInputs() { return originalInvoker.AllocateInputs(); } 

    public object Invoke(object instance, object[] inputs, out object[] outputs) 
    { 
     //Do stuff before call 
     var res = this.originalInvoker.Invoke(instance, inputs, out outputs); 
     //stuff after call 
     return res; 
    } 

    public IAsyncResult InvokeBegin(object instance, object[] inputs, 
       AsyncCallback callback, object state) 
    { 
     //Do stuff before async call 
     var res = this.originalInvoker.InvokeBegin(instance, inputs, callback, state); 
     return res; 
    } 

    public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result) 
    { 
     var res = this.InvokeEnd(instance, out outputs, result); 
     //Do stuff after async call 
     return res; 
    } 
} 

thực hiện như một thuộc tính cho tất cả các hoạt động trong dịch vụ:

public class MyBehaviorAttribute : Attribute, IServiceBehavior, IOperationBehavior 
{ 
    //IOperationBehavior 
    public void ApplyDispatchBehavior(OperationDescription operationDescription, 
      DispatchOperation dispatchOperation) 
    { 
     dispatchOperation.Invoker = new MyOperationInvoker(dispatchOperation.Invoker); 
    } 

    public void AddBindingParameters(OperationDescription operationDescription, 
      BindingParameterCollection bindingParameters) { /*Do nothing*/ } 

    public void ApplyClientBehavior(OperationDescription operationDescription, 
      ClientOperation clientOperation) { /*Do nothing*/ } 

    public void Validate(OperationDescription operationDescription) { /*Do nothing*/ } 

    //IServiceBehavior 
    public void Validate(ServiceDescription serviceDescription, 
       ServiceHostBase serviceHostBase) { /*Do nothing*/ } 

    public void AddBindingParameters(ServiceDescription serviceDescription, 
       ServiceHostBase serviceHostBase, 
       Collection<ServiceEndpoint> endpoints, 
       BindingParameterCollection bindingParameters) { /*Do nothing*/ } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, 
       ServiceHostBase serviceHostBase) 
    { 
     foreach (ServiceEndpoint endpoint in serviceHostBase.Description.Endpoints) 
     { 
      foreach (var operation in endpoint.Contract.Operations) 
      { 
       operation.Behaviors.Add(this); 
      } 
     } 
    } 

Và các dịch vụ:

[MyBehavior] 
public class HelloService : IHelloService 
{ 
    ... 
} 
Các vấn đề liên quan