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

Код: 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
23.02.2011, 19:54
    #37132583
aleks-sam
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент на базе Form и дуплексный контракт.
UseSynchronizationContext

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

Еще не забывайте про ConcurrencyMode = ConcurrencyMode.Multiple если надо.
...
Рейтинг: 0 / 0
23.02.2011, 22:15
    #37132694
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент на базе Form и дуплексный контракт.
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
24.02.2011, 04:51
    #37132913
aleks-sam
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент на базе Form и дуплексный контракт.
LexxxxxЕсли можно, простым языком объясните, почему клиент с моими настройками виснет, если он на базе Form?
В статье, которую я привел, автор в двух словах описывает суть проблемы зависания .
...
Рейтинг: 0 / 0
24.02.2011, 10:27
    #37133121
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент на базе Form и дуплексный контракт.
aleks-sam,

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


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