WCF: StreamedResponse генерирует Timeout после нескольких обработанных вызовов - PullRequest
1 голос
/ 22 августа 2011

Я пытаюсь настроить WCF-Web, который возвращает данные из базы данных в виде потокового ответа клиенту.В настоящее время метод возвращает 45.000 элементов.

Моя проблема в том, что когда я пытаюсь вызвать этот метод пару раз, некоторые запросы будут выполнены успешно, в то время как следующий вызов завершается с TimeoutException - кажется, клиент не может установить новое подключение кгостья.Если я изменю TransferMode на «Buffered», он будет работать так, как задумано.

Количество успешно обработанных вызовов может быть увеличено путем увеличения System.Net.ServicePointManager.DefaultConnectionLimit до большего числа.

Мне кажется, что клиент не закрывает соединение?Но почему только в режиме StreamedResponse?Где ошибка?Любая идея?

Источник:

public static void DoCall() {
        var factory = new ChannelFactory<ICacheService>("ICacheService", new EndpointAddress(...));
        ICacheService service = factory.CreateChannel();
        try
        {

        var itemsMessage = service.DoStreaming(
            Message.CreateMessage(MessageVersion.Soap11, "DoStreaming", "SomeArgumnt")
        );

        foreach (Item item in GetAllItems(itemsMessage))
        {
            ...
        }

        var serviceChannel = ((IServiceChannel) service);
        if (serviceChannel.State != System.ServiceModel.CommunicationState.Faulted)
            serviceChannel.Close();

        itemsMessage.Close();
        ((IServiceChannel)service).Close();         

        }
        catch (Exception ex)
        {
            ((IServiceChannel) service).Abort();
        }   

        factory.Close();            
    }

    private static IEnumerable<Item> GetAllItems(System.ServiceModel.Channels.Message message)
    {
        XmlReader reader = message.GetReaderAtBodyContents();
        if (reader.LocalName != "results")
        {
            throw new Exception("The service returned an invalid message");
        }

        XmlSerializer serializer = new XmlSerializer(typeof(Item));
        reader.ReadStartElement("results");

        while (!reader.EOF && reader.LocalName == "Item")
        {
            yield return (Item)serializer.Deserialize(reader);
        }

        reader.ReadEndElement();
    }

Привязка клиента:

<binding
               name="BasicHttpBinding_ICacheService"
               openTimeout="00:01:00"
               receiveTimeout="00:01:00"
               sendTimeout="00:10:00"
               maxReceivedMessageSize="1000000000"
               transferMode="Buffered"
            >
           <readerQuotas
               maxDepth="2147483647"
               maxStringContentLength="2147483646"
               maxArrayLength="2147483647"
               maxBytesPerRead="2147483647"
               maxNameTableCharCount="2147483647"
                />
           <security mode="None">
               <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
               <message clientCredentialType="UserName" algorithmSuite="Default" />
           </security>
       </binding>
...