我怎么知道有多少客户端正在调用我的WCF服务功能

时间:2010-05-04 13:37:17

标签: c# wcf multithreading

我正在编写一个程序来测试高并发环境下的WCF服务性能。

在客户端,我启动许多线程来调用WCF服务函数,该函数返回一长串数据对象。

在服务器端,在我的客户端调用的函数中,我需要知道调用该函数的客户端数量。

为此,我设置了一个计数器变量。在函数的开头,我将计数器加1,但如何在函数返回结果后减少它

int clientCount=0;
public DataObject[] GetData()
{
     Interlocked.Increment(ref clientCount);
     List<DataObject> result = MockDb.GetData();
     return result.ToArray();
     Interlocked.Decrement(ref clientCount);    //can't run to here...
}

我在c ++中看到了一种方法。

创建一个名为counter的新类。

在计数器类的构造函数中,增加变量。 并在析构函数中减少它。

在函数中,创建一个计数器对象,以便调用其构造函数。 函数返回后,将调用它的析构函数。

像这样:

class counter
{
public:
    counter(){++clientCount;  /* not simply like this, need to be atomic*/}
    ~counter(){--clientCount;  /* not simply like this, need to be atomic*/}
};

...
myfunction()
{
    counter c;
    //do something
    return something;
}

在c#中,我想我可以使用以下代码执行此操作,但不能确定。

public class Service1 : IService1
{
    static int clientCount = 0;

    private class ClientCounter : IDisposable
    {
        public ClientCounter()
        {
            Interlocked.Increment(ref clientCount);
        }

        public void Dispose()
        {
            Interlocked.Decrement(ref clientCount);
        }
    }

    public DataObject[] GetData()
    {
        using (ClientCounter counter = new ClientCounter())
        {
            List<DataObject> result = MockDb.GetData();
            return result.ToArray();
        }
    }
}

我写了一个计数器类实现 IDisposable 接口。 并将我的功能代码放入使用块。 但似乎它没有那么好用。 无论我启动多少个线程,clientCount变量都远小于线程数。

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:4)

查看WCF使用的各个层。你可以插入其中一个。

例如,将IDispatchMessageInspector添加到您的EndpointBehavior:

public class ConsoleOutputMessageInspector : IDispatchMessageInspector
{
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
         Console.WriteLine("Starting call");
         // count++ here
         return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        // count-- here
        Console.WriteLine("Returning");
    }
}

在此处查看更多内容:http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx

看看如何在这里扩展WCF: http://msdn.microsoft.com/en-us/magazine/cc163302.aspx#S6

答案 1 :(得分:0)

您是否尝试过WCF的内置性能计数器:

http://msdn.microsoft.com/en-us/library/ms735098.aspx