powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Раскрытие контракта о службе с помощью нескольких привязок
12 сообщений из 12, страница 1 из 1
Раскрытие контракта о службе с помощью нескольких привязок
    #37039147
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь создать службу с несколькими привязками, ориентируясь по примеру из книги "Основы WCF для .NET Framework 3.5". В книжке есть в качестве примера кусок файла конфигурации:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <system.serviceModel>
      <services>
         <service name="EssentialWCF.StockQuoteService">
            <endpoint binding="wsHttpBinding"
               contract="EssentialWCF.IStockQuoteService"
               address=”http://localhost/wshttpendpoint” />
            <endpoint binding="netTcpBinding"
               contract="EssentialWCF. IStockQuoteService"
               address=”net.tcp://localhost/nettcpendpoint” />
            </service>
      </services>
   </system.serviceModel>
</configuration>

Я пытаюсь реализовать несколько привязок кодом (ну так мне надо!):
Код: 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.
namespace MyRoleBasedWCFService
{
    class Program
    {
        static void Main()
        {
            Uri baseAddress = new Uri("net.tcp://localhost:8000");
            Uri baseHttpAddress = new Uri("http://localhost:8001");
            //ServiceHost selfHost = new ServiceHost(typeof(MyService), baseAddress);
            ServiceHost selfHost = new ServiceHost(typeof(MyService), new Uri[] { baseAddress, baseHttpAddress });
            //ServiceHost selfHost = new ServiceHost(typeof(MyService));

            try
            {
                var binding = new NetTcpBinding();
                binding.Security.Mode = SecurityMode.Transport;
                binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
                binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

                var httpBinding = new WSHttpBinding();
                httpBinding.Security.Mode = SecurityMode.None;
                httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
                httpBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

                //selfHost.AddServiceEndpoint(typeof(MyServiceInterface), binding, baseAddress + "/MyTCPTestServices/MS");
                selfHost.AddServiceEndpoint(typeof(MyServiceInterface), binding, "MyTCPTestServices/MS");
                //selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, baseHttpAddress + "/MyHttpTestServices/MS");
                //selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, "MyHttpTestServices/MS");

                //ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                //selfHost.Description.Behaviors.Add(smb);

                //selfHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), baseAddress + "/MyTCPTestServices/MS/mex");
                //selfHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), baseHttpAddress + "/mex");

                selfHost.Authorization.ServiceAuthorizationManager = new MyAuthorizationManager();
                //selfHost.Authorization.ServiceAuthorizationManager

                selfHost.Authentication.ServiceAuthenticationManager = new MyServiceAuthenticationManager();

                //selfHost.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.Custom;
                selfHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = System.ServiceModel.Security.UserNamePasswordValidationMode.Custom;
                selfHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new MyPasswordValidator();
                //selfHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode=System.ServiceModel.Security.UserNamePasswordValidationMode.

                selfHost.Open();
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                selfHost.Close();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("An exception occurred: {0}", ce.Message);
                selfHost.Abort();
            }
        }
    }
}

Как только я делаю
Код: plaintext
ServiceHost selfHost = new ServiceHost(typeof(MyService), new Uri[] { baseAddress, baseHttpAddress });
я на клиенте получаю:
System.ServiceModel.EndpointNotFoundException не обработано
Message=Не удалось подключиться к net.tcp://192.168.1.203:8000/MyTCPTestServices/MS. Попытки подключения выполнялись в течение интервала времени 00:00:01.0680000. Код ошибки TCP 10051: Сделана попытка выполнить операцию на сокете при отключенной сети 192.168.1.203:8000.

Когда
Код: plaintext
ServiceHost selfHost = new ServiceHost(typeof(MyService), baseAddress);
клиент работает нормально.

Как правильно организовать несколько привязок для одной службы?
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37039664
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx,

а если вместо
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), binding, baseAddress + "/MyTCPTestServices/MS");
задавать
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), binding, new Uri("net.tcp://localhost:8000/MyTCPTestServices/MS"));

?
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37039849
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

А что делать с selfHost.BaseAdresses? Или задание базового адреса(ов) не обязательно? Вообще, толком не понимаю что с этими адресами делать! Как я думал раньше адреса конечных точек равны BaseAdress + адрес точки, указанный в методе selfHost.AddServiceEndpoint. Но если BaseAdresses это массив, то как система определит, к какому именно базовому адресу добавлять адрес из selfHost.AddServiceEndpoint? Или это будет добавлено ко всем базовым адресам и конечная точка будет доступна по всем адресам?
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37039871
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx,

думаю, проблема в лишнем слеше - "/"
т.е., baseAddress(.ToString()) +"/MyTCPTestServices/MS"= "net.tcp://localhost:8000//MyTCPTestServices/MS"

если причина в этом, то задавайте либо полностью, либо так
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), binding, "MyTCPTestServices/MS");
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, "MyTCPTestServices/MS");
а WCF по биндингу (по идее) сам определит базовые адреса...
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37039874
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRлибо полностью
в т.ч. можно ж так
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), binding, baseAddress + "MyTCPTestServices/MS");
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, baseHttpAddress + "MyTCPTestServices/MS");

главное - чтобы не двоился слеш
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37039877
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx,

вдогонку - если задавать адреса полностью, то, разумеется, Endpoint-у пофиг какие базовые адреса у ServiceHost-а
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37039879
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вдогонку - если задавать адреса полностью, то, разумеется, Endpoint-у пофиг какие базовые адреса у ServiceHost-а[/quot]

Т.е. если в точке указан полный адрес (т.е. начинающийся с имени одно из известных протоколов?) базовые адреса службы игнорируются?
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37039889
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LexxxxxТ.е. если в точке указан полный адрес (т.е. начинающийся с имени одно из известных протоколов?) базовые адреса службы игнорируются?
да, например, надо слушать на нескольких портах, в т.ч. и на базовом 8001, пишем
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, "MyTCPTestServices/MS");
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, " http://localhost:8002/MyTCPTestServices/MS");
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, " http://localhost:8003/MyTCPTestServices/MS");
...и т.д. - должно работать
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37040184
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

Сделал так:
Код: 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.
namespace MyRoleBasedWCFService
{
    class Program
    {
        static void Main()
        {
            Uri baseAddress = new Uri("net.tcp://localhost:8000");
            Uri baseHttpAddress = new Uri("http://localhost:8001");
            //ServiceHost selfHost = new ServiceHost(typeof(MyService), baseAddress);
            //ServiceHost selfHost = new ServiceHost(typeof(MyService), new Uri[] { baseAddress, baseHttpAddress });
            ServiceHost selfHost = new ServiceHost(typeof(MyService));

            try
            {
                var binding = new NetTcpBinding();
                binding.Security.Mode = SecurityMode.Transport;
                binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
                binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

                var httpBinding = new WSHttpBinding();
                httpBinding.Security.Mode = SecurityMode.None;
                httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
                httpBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

                //selfHost.AddServiceEndpoint(typeof(MyServiceInterface), binding, baseAddress + "MyTCPTestServices/MS");
                selfHost.AddServiceEndpoint(typeof(MyServiceInterface), binding, "net.tcp://localhost:8000/MyTCPTestServices/MS");
                //selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, baseHttpAddress + "MyHttpTestServices/MS");
                selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, "http://localhost:8001/MyHttpTestServices/MS");

                //ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                //selfHost.Description.Behaviors.Add(smb);

                //selfHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), baseAddress + "/MyTCPTestServices/MS/mex");
                //selfHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), baseHttpAddress + "/mex");

                selfHost.Authorization.ServiceAuthorizationManager = new MyAuthorizationManager();
                //selfHost.Authorization.ServiceAuthorizationManager

                selfHost.Authentication.ServiceAuthenticationManager = new MyServiceAuthenticationManager();

                //selfHost.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.Custom;
                selfHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = System.ServiceModel.Security.UserNamePasswordValidationMode.Custom;
                selfHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new MyPasswordValidator();
                //selfHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode=System.ServiceModel.Security.UserNamePasswordValidationMode.

                selfHost.Open();
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();

                // Close the ServiceHostBase to shutdown the service.
                selfHost.Close();
            }
            catch (CommunicationException ce)
            {
                Console.WriteLine("An exception occurred: {0}", ce.Message);
                selfHost.Abort();
            }
        }
    }
}

Имеем исключение:
Не удалось подключиться к net.tcp://192.168.1.203:8000/MyTCPTestServices/MS. Попытки подключения выполнялись в течение интервала времени 00:00:01.0520000. Код ошибки TCP 10051: Сделана попытка выполнить операцию на сокете при отключенной сети 192.168.1.203:8000.

Если убрать подключение второй точки
Код: plaintext
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, "http://localhost:8001/MyHttpTestServices/MS");
Тогда оставшаяся точка работает нормально. Что же ему не нравится?
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37040827
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а наоборот, вторая точка без первой работает?
открывается ли порт telnet-ом?
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37040896
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

Похоже я нещадно туплю! То Uri к стрингу прибавлял не подумав про слеш, теперь оказалось что я забыл студию от админа запустить. Хотя я был в подобной ситуации и тогда студия говорила что "не удалось зарегистрировать адрес... Запустите от администратора...". Сейчас она ничего не говорила, но именно это ей было надо. Точки запустились. Один из клиентов работает. Второй еще не написан. :) Большое Вам спасибо за помощь!

P.S. А на одном порту как я понимаю две разных привязки не могут работать, но могут две службы с разными именами, но одним протоколом?
...
Рейтинг: 0 / 0
Раскрытие контракта о службе с помощью нескольких привязок
    #37041033
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LexxxxxP.S. А на одном порту как я понимаю две разных привязки не могут работать, но могут две службы с разными именами, но одним протоколом?
наверное нет и нет, "слушатель" может быть только один, но нетрудно проверить на практике...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Раскрытие контракта о службе с помощью нескольких привязок
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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