简体   繁体   English

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

[英]How to see who consumes my webservice

Is there any way to see who consumes my web service and how he uses it? 有没有办法查看谁在使用我的Web服务以及他如何使用它? Is there a logging system for that? 是否有一个日志记录系统?

My consumer is not sure whether he is connected to my web service or not, and I cannot see that either. 我的消费者不确定他是否已连接到我的Web服务,我也看不到。

You can use a logging library such as log4net or the one in the enterprise library 您可以使用日志库,例如log4net企业库中的一个

If your service is a WCF service, adding an operation behavior allows you to perform some action every time an operation is invoked 如果您的服务是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
{
    ...
}

You can use a tool like Wireshark to see exactly what messages your service is receiving. 您可以使用Wireshark之类的工具来确切查看您的服务正在接收什么消息。

It's good to add logging to to see exactly what your service is doing with the messages, something like Log4Net is very good. 添加日志记录以准确查看您的服务正在处理消息是一件好事,例如Log4Net就是很好。

Without both of these setup you won't be sure what is going on. 没有这两种设置,您将无法确定发生了什么。

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

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