Использование веб-службы WCF - PullRequest
1 голос
/ 10 июня 2010

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

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

Код:

namespace WebService 
{ 
   [ServiceContract] 
   public interface IService 
   { 
     [OperationContract(Name="Result")] 
     [WebGet(UriTemplate = "/")] 
     Stream Result();   
   } 

   public class Service:IService 
   { 
        public Stream Result() 
        { 
           // read a file from the server and return it as stream 
        } 
   } 
}

The client:
namespace WebServiceClient
{
   [ServiceContract] 
   public interface IService 
   { 
     [OperationContract(Name="Result")] 
     [WebGet(UriTemplate = "/")] 
     Stream Result();   
   } 

}

static void Main()
{

     Console.WriteLine("Press enter when the service is available");
     Console.ReadLine();

     // creating factory
     HttpChunkingBinding binding = new HttpChunkingBinding();
     binding.MaxReceivedMessageSize = 0x7fffffffL;

     ChannelFactory<WebServiceClient.IService> factory = new   ChannelFactory<WebServiceClient.IService>
            (binding, new EndpointAddress("http://localhost/WebService/Service"));

            WebServiceClient.IService service = factory.CreateChannel();

       for(int i = 0; i < 10; i++)
       {
            Stream s = service.Result();
            // write this stream to a file and close the stream
       }

            //Closing our channel.
            ((IClientChannel)service).Close();

}

Спасибо,

Ответы [ 3 ]

1 голос
/ 11 июня 2010

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

   for(int i = 0; i < 10; i++) 
   { 
        ChannelFactory<WebServiceClient.IService> factory = 
           new ChannelFactory<WebServiceClient.IService>(
               binding, 
               new EndpointAddress("http://localhost/WebService/Service")); 

        WebServiceClient.IService service = factory.CreateChannel(); 
        using(service as IDsposable)
        {
          using(MemoryStream s = service.Result() as MemoryStream)
          {
             // write this stream to a file
          }
        }
   } 
0 голосов
/ 11 июня 2010

Похоже, вы пытаетесь реализовать Chunking Channel.Взгляните на эту статью , которая определяет, как ее реализовать.

В конце статьи объясняется , как настроить пример проекта WCF.В примере проекта есть пример фрагментирования.

Я почти уверен, что соединение не закрывается, потому что вы еще не завершили чтение всех данных.Поскольку вы чанкинг, не все данные доставляются одновременно.Вы просите кусок, обрабатываете его и затем просите другой кусок.

Удачи,

Патрик

0 голосов
/ 10 июня 2010

Вы не опубликовали код, поэтому я собираюсь дать дикое предположение:

У вас максимальное количество открытых соединений, равное 1, и вы открываете соединение с веб-сервисом в циклееще не закрывая соединение как часть цикла.Это создает ситуацию, когда ваша вторая итерация ожидает тайм-аут на первом соединении (которое, вероятно, установлено на 10 минут).

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