Помогите с WCF TCP/IP
От: WhiteMonk  
Дата: 24.11.09 09:13
Оценка:
Доброго времени суток...

Помогите пожалуйста с такой проблемой:
Мне нужно, чтоб мой клиент соединялся с сервисом по протоколу TCP и забирал от туда список с данными.
Поиск в сети ничего не дал
Загвостка в том, что как тока я хочу получить с сервиса большой список данных появляется ошибка:
"Контракту требуется свойство Session, однако привязка "NetTcpBinding" его не поддерживает или этого не позволяет неправильная настройка."

Нигде не нащел ответа на эту ошибку, просто не понимаю, в чем проблема

Может я что-то упустил существенное?
Помогите разобраться с этим...
Заранее благодарю.

 Contract:

/*часть класса с данными (на всякий случай)*/
   [DataContract]
   public class BigLog
   {
      int id;
      string name;

      public Log(int _id, string _name)
      {
         id = _id;
         name = _name;
      }
      [DataMember]
      public Int32 ID
      {
         get { return id; }
         set { id = value; }
      }
      [DataMember]
      public String Name
      {
         get { return name; }
      }
      
     ........
   }

   [ServiceContract(SessionMode = SessionMode.Required)]
   public interface IContract1
   {
      [OperationContract(IsInitiating = true, IsOneWay = true, IsTerminating = false)]
      void Join();
      [OperationContract(IsInitiating = false, IsOneWay = true, IsTerminating = true)]
      void Leave();
      [OperationContract(IsInitiating = false, IsOneWay = false, IsTerminating = false)]
      List<BigLog> GetDataList();
   }



 Service:

   [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
   public class Service1 : IContract1
   {
      public Service1() { }

      public void Join()
      {
         Console.WriteLine("Join new client...");
      }
      public void Leave()
      {
         Console.WriteLine("Client leave...");
      }
      public List<BigLog> GetDataList()
      {
         int count = 100;
         List<BigLog> lst = new List<BigLog>(count);

         for (int i = 0; i < count; i++)
            lst.Add(new BigLog(true, i));

         return lst;
      }
   }

      static void Main(string[] args)
      {
         ServiceHost host = new ServiceHost(typeof(Service1));

         #region Net Tcp Binding
         NetTcpBinding binding = new NetTcpBinding();
         binding.TransferMode = TransferMode.Streamed;
         binding.MaxReceivedMessageSize = int.MaxValue;
         binding.CloseTimeout = TimeSpan.MaxValue;
         binding.SendTimeout = TimeSpan.MaxValue;
         host.AddServiceEndpoint(typeof(IContract1), binding, new Uri("net.tcp://localhost:5000/Services"));
         #endregion

         #region Matadata Exchange Binding
         host.Description.Behaviors.Add(new ServiceMetadataBehavior());
         Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
         host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, new Uri("net.tcp://localhost:5000/Services/mex"));
         #endregion

         host.Open();

         Console.WriteLine("Service open...");
         Console.ReadKey();

         host.Close();
         Console.WriteLine("Service close...");
         Console.ReadKey();
      }



 Client:

      static void Main(string[] args)
      {
         NetTcpBinding binding = new NetTcpBinding();
         binding.TransferMode = TransferMode.Streamed;
         binding.SendTimeout = TimeSpan.MaxValue;

         EndpointAddress address = new EndpointAddress("net.tcp://localhost:5000/Services");
         ChannelFactory<IContract1> channel = new ChannelFactory<IContract1>(binding, address);

         IContract1 uploader = channel.CreateChannel();
         List<BigLog> lst = uploader.GetDataList();

         Console.ReadKey();
         ((IClientChannel)uploader).Close();
      }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.