Каков наиболее эффективный способ сделать несколько (параллельных) запросов к веб-сервису с использованием WCF? - PullRequest
0 голосов
/ 20 августа 2009

У меня есть клиент службы WCF, и он был создан с использованием аргумента /async с svcutil.exe, поэтому он использует модель асинхронного программирования . Когда я делаю несколько асинхронных запросов с одним клиентом, хотя он сериализует выполнение этих запросов.

Вот пример, который показывает, как я выполняю запросы parellel.

[TestMethod]
public void AsyncTest()
{
    var req1 = Helpers.Request["Symbol"];
    var req2 = Helpers.Request["Summary"];

    using(var client = new SoapClientAsync(_TcpBinding, _TestRunConfig.ServiceAddress))
    {
        IAsyncResult[] results = new[]
            {
                client.BeginExec(req1, new AsyncCallback(asyncComplete), new MyAsyncState { Client = client, Request = req1 }),
                client.BeginExec(req2, new AsyncCallback(asyncComplete), new MyAsyncState { Client = client, Request = req2 })
            };

        WaitHandle[] waits = results.Select(i => (MyAsyncState)i.AsyncState).Select(i => i.WaitEvent).ToArray();
        WaitHandle.WaitAll(waits);

        var states = results.Select(i => (MyAsyncState)i.AsyncState);

        foreach (var state in states)
        {
            Console.WriteLine(string.Format("client {0}", state.Watch.ElapsedMilliseconds));
            Console.WriteLine(string.Format("server {0}", state.Response.ExecutionSummary.Single(i => i.Message == "Total").Duration));
        }
    }
}

private void asyncRequestComplete(IAsyncResult ar)
{
    TestAsyncState state = (MyAsyncState)ar.AsyncState;
    state.Response = state.Client.EndExec(ar);
    state.Watch.Stop();
    state.WaitEvent.Set();
}

Вот вывод, который я вижу:

клиент 26
сервер 24

клиент 53
сервер 26

Сервер сообщает о согласованном времени выполнения ~ 25 мс. Но вполне очевидно, что сериализация каждого запроса выполняется на стороне клиента.

Как правильно выполнить запросы parellel к конечной точке веб-службы с использованием WCF?

1 Ответ

1 голос
/ 20 августа 2009

Ответ довольно прост - использовать более одного экземпляра клиента и выдавать по одному запросу на каждый. Мыльные клиенты чрезвычайно легкие, поэтому я без колебаний использую их столько, сколько имеет смысл для вашего сценария.

...