2010-09-27 15 views
7

C'è un modo per vedere chi consuma il mio servizio web e come lo usa? Esiste un sistema di registrazione per questo?Come vedere chi consuma il mio webservice

Il mio consumatore non è sicuro se è connesso al mio servizio web o meno, e non riesco a vederlo neanche io.

+1

Stai usando WCF? –

risposta

5

È possibile utilizzare una libreria di registrazione, come log4net o quello nel enterprise library

Se il servizio è un servizio WCF, l'aggiunta di un comportamento operazione consente di eseguire una certa azione ogni volta che un'operazione è invocato

internal class OperationLoggerBehavior : IOperationBehavior 
{ 
    public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation) 
    { 
    } 

    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) 
    { 
     dispatchOperation.ParameterInspectors.Add(new OperationLogger()); 
    } 

    public void Validate(OperationDescription operationDescription) 
    { 
    } 
} 

internal class OperationLoggerAttribute : Attribute, IContractBehavior 
{ 
    public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
    { 
    } 

    public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
    { 
    } 

    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) 
    { 
     foreach (OperationDescription operationDescription in contractDescription.Operations) 
     { 
      if (!operationDescription.Behaviors.Contains(typeof(OperationLoggerBehavior))) 
      { 
       operationDescription.Behaviors.Add(new OperationLoggerBehavior()); 
      } 
     } 
    } 

    public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint) 
    { 
    } 
} 


internal class OperationLogger : IParameterInspector 
{ 
    /// <summary> 
    /// Called before an operation is invoked. 
    /// </summary> 
    /// <param name="operationName"></param> 
    /// <param name="inputs"></param> 
    /// <returns></returns> 
    public object BeforeCall(string operationName, object[] inputs) 
    { 
     // Write to log  
    } 

    /// <summary> 
    /// Called after an operation has been invoked. 
    /// </summary> 
    /// <param name="operationName"></param> 
    /// <param name="outputs"></param> 
    /// <param name="returnValue"></param> 
    /// <param name="correlationState"></param> 
    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState) 
    { 
     // Write to log  
    } 
} 




// Service contract implementation  
[OperationLogger] 
[ServiceBehaviorAttribute(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public partial class MyService : IMyService 
{ 
    ... 
} 
1

È possibile utilizzare uno strumento come Wireshark per visualizzare esattamente quali messaggi vengono ricevuti dal servizio.

È utile aggiungere la registrazione per vedere esattamente cosa sta facendo il servizio con i messaggi, qualcosa come Log4Net è molto buono.

Senza entrambe queste impostazioni non si è sicuri di cosa sta succedendo.

Problemi correlati