2016-04-05 11 views
0

Bir WCF Hizmetinde, bazı başlıkların asıllık hizmeti iletilerindeki iletilerini denetleyen bir özellik ekledim [WebAppServiceBehavior].IServiceBehavior: Bazı iletiler için İleti denetçilerinin uygulanmasını önleme

Bu denetimleri yok sayabilecek bazı özel yöntemlerde başka öznitelikler kullanabiliyordum.

Sorunum bir hizmette 20 tane yöntem var. & Bu denetimden sadece 2 tane yöntemi dışlamak istiyorum.

[WebAppServiceBehavior] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class SyncService : ISyncService 
    { 
     public void DoWork() //check here 
     { 

     } 


public void DoWork2()//ignore here 
     { 

     } 

} 


    public class WebAppServiceBehavior : Attribute, IServiceBehavior 
    { 

     public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
     { 

     } 

     public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
      // throw new NotImplementedException(); 

      foreach (ChannelDispatcher ch in serviceHostBase.ChannelDispatchers) 
      { 
       foreach (var endptDispatcher in ch.Endpoints) 
       { 
        endptDispatcher.DispatchRuntime.MessageInspectors.Add(new WebAppServiceMessageInspector()); 
       } 
      } 
     } 

     public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
     { 
     } 
    } 

    public class WebAppServiceMessageInspector : IDispatchMessageInspector 
    { 
     public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext) 
     { 
      var prop = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; 



       HttpRequestMessageProperty httpProp = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name]; 
     object operationName; 
     request.Properties.TryGetValue(WebHttpDispatchOperationSelector.HttpOperationNamePropertyName, out operationName); 
     if (httpProp != null && operationName != null && operationName.ToString().ToLower() == "options".ToLower()) 
     { 
       return "Options";    
     } 



      /*if (ISValid Login) //checking here For a specific header & returning error or success. 
      { 
       return instanceContext; 
      } 
      else 
      { 
       throw new FaultException("Invalid Authorization Code" + Ac.ErrorMsg); 
      }*/ 
return instanceContext; 
     } 

     public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
     { 

     } 
    } 

cevap

0

Denetimi yok saymam gereken yöntemlere [IgnoreValidation] özelliğini ekledim. Örn From Above

public class IgnoreValidation : Attribute 
    { 

    } 

: Soru: Inspector'da

[WebAppServiceBehavior] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class SyncService : ISyncService 
    { 
     public void DoWork() //check here 
     { 

     } 

**[IgnoreValidation]** 
public void DoWork2()//ignore here 
     { 

     } 

} 

&, ben operasyon niteliği olup olmadığı kontrol etmek için bu kodu eklendi.

string actionName = Convert.ToString(operationName); 
      if (!string.IsNullOrEmpty(actionName)) 
      { 
       var methodInfo = instanceContext.Host.Description.ServiceType.GetMethod(actionName); 
       if (methodInfo != null) 
       { 
        var customAttributes = methodInfo.GetCustomAttributes(false); 
        if (customAttributes.Any(ca => ca.GetType().Equals(typeof(IgnoreValidation)))) 
        { 
         return instanceContext; 
        } 
       } 
      } 
İlgili konular