Я пытаюсь настроить 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>