powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Клиент на базе Form и дуплексный контракт.
5 сообщений из 5, страница 1 из 1
Клиент на базе Form и дуплексный контракт.
    #37132565
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть сервер:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
using System;
using System.Data;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Server
{
    class Program
    {
        private const int MyProductServicePort = 8000;

        static void Main(string[] args)
        {
            Uri adminServiceUri = new Uri("net.tcp://localhost:" + MyProductServicePort + "/AdminService");

            var adminServiceHost = new ServiceHost((typeof(AdminService)), adminServiceUri);

            NetTcpBinding adminServiceBinding = new NetTcpBinding(SecurityMode.Transport);
            adminServiceBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;

            ServiceEndpoint endPoint = adminServiceHost.AddServiceEndpoint(typeof(IMyService), adminServiceBinding, "");

            ServiceMetadataBehavior metadataBehavior = new ServiceMetadataBehavior();
            adminServiceHost.Description.Behaviors.Add(metadataBehavior);
            adminServiceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), adminServiceUri + "/mex");

            adminServiceHost.Open();

            Console.WriteLine("Server started.");
            Console.ReadKey();
        }
    }

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerSession)]
    class AdminService : IMyService
    {

        IClientCallback Client
        {
            get
            {
                return OperationContext.Current.GetCallbackChannel<IClientCallback>();
            }
        }

        public void ConnectUser(string BaseName, bool Monopoly)
        {
            Console.WriteLine("ConnectUser called!");
            Client.SetHeartBeatInterval(new TimeSpan(50000));
        }

        public DataTable GetInfo()
        {

            return new DataTable();
        }

    }

    public interface IClientCallback
    {
        [OperationContract(IsOneWay = true)]
        void SetHeartBeatInterval(TimeSpan Interval);
    }

    [ServiceContract(CallbackContract = typeof(IClientCallback))]
    public interface IMyService
    {
        [OperationContract]
        void ConnectUser(String BaseName, bool Monopoly);

        [OperationContract]
        DataTable GetInfo();
    }
}


и клиент:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
using System;
using System.ServiceModel;
using Client.ServiceReference1;
using System.Windows.Forms;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            var fff = new ServiceClient();
            fff.Go();
        }
    }


    class ServiceClient : Form, IMyServiceCallback
    //class ServiceClient : IMyServiceCallback
    {
        MyServiceClient myService;

        public ServiceClient()
        {
            NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport);
            binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
            EndpointAddress endPointAddress = new EndpointAddress("net.tcp://localhost:8000/AdminService");
            var instaceContext = new InstanceContext(this);
            myService = new MyServiceClient(instaceContext, binding, endPointAddress);
        }

        public void Go()
        {
            myService.ConnectUser("fff", true);

            Console.WriteLine("Client started.");

            Console.ReadKey();
        }

        public void SetHeartBeatInterval(TimeSpan ts)
        {
            Console.WriteLine("SetHeartBeatInterval called!");
        }
    }
}

Когда пишешь class ServiceClient : IMyServiceCallback то все работает нормально. Когда указываешь class ServiceClient : Form, IMyServiceCallback все это перестает работать. Если стать отладчиком, то видно что метод на клиенте вызывается, но сразу после вылета сервиса по таймауту (1 мин.). Подскажите, как правильно организовать клиента с обратным вызовом на базе Form? Я знаю что в приведенном коде можно просто переделать сервис на односторонний контракт, но меня интересует как сделать именно с дуплексным контрактом клиента на базе Form.
...
Рейтинг: 0 / 0
Клиент на базе Form и дуплексный контракт.
    #37132583
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UseSynchronizationContext

[CallbackBehavior(UseSynchronizationContext = false)]
class ServiceClient : Form, IMyServiceCallback

Еще не забывайте про ConcurrencyMode = ConcurrencyMode.Multiple если надо.
...
Рейтинг: 0 / 0
Клиент на базе Form и дуплексный контракт.
    #37132694
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks-samЕще не забывайте про ConcurrencyMode = ConcurrencyMode.Multiple если надо.
По моим скромным понятиям о WCF мне именно надо
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerSession)]
Я не до конца понимаю что будет происходить при ConcurrencyMode = ConcurrencyMode.Multiple и ConcurrencyMode = ConcurrencyMode.Reentrant. О [CallbackBehavior(UseSynchronizationContext = false)] практически ничего не знаю. Почитаю. Спасибо!
Если можно, простым языком объясните, почему клиент с моими настройками виснет, если он на базе Form?
...
Рейтинг: 0 / 0
Клиент на базе Form и дуплексный контракт.
    #37132913
Фотография aleks-sam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LexxxxxЕсли можно, простым языком объясните, почему клиент с моими настройками виснет, если он на базе Form?
В статье, которую я привел, автор в двух словах описывает суть проблемы зависания .
...
Рейтинг: 0 / 0
Клиент на базе Form и дуплексный контракт.
    #37133121
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks-sam,

Спасибо за статью! То что надо! :)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Клиент на базе Form и дуплексный контракт.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]