繁体   English   中英

如何查看谁在使用我的Web服务

[英]How to see who consumes my webservice

有没有办法查看谁在使用我的Web服务以及他如何使用它? 是否有一个日志记录系统?

我的消费者不确定他是否已连接到我的Web服务,我也看不到。

您可以使用日志库,例如log4net企业库中的一个

如果您的服务是WCF服务,则添加操作行为可以使您在每次调用操作时执行一些操作

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
{
    ...
}

您可以使用Wireshark之类的工具来确切查看您的服务正在接收什么消息。

添加日志记录以准确查看您的服务正在处理消息是一件好事,例如Log4Net就是很好。

没有这两种设置,您将无法确定发生了什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM