как узнать, сколько клиентов вызывает мою сервисную функцию WCF - PullRequest
2 голосов
/ 04 мая 2010

Я пишу программу для тестирования производительности службы 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.

В конструкторе класса 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 ]

4 голосов
/ 04 мая 2010

Посмотрите на различные слои, используемые 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

0 голосов
/ 04 мая 2010

Вы пробовали встроенные счетчики производительности WCF:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...