Гость
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / Раскрытие контракта о службе с помощью нескольких привязок / 12 сообщений из 12, страница 1 из 1
28.12.2010, 14:56
    #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
28.12.2010, 18:24
    #37039664
LR
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
28.12.2010, 20:28
    #37039849
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскрытие контракта о службе с помощью нескольких привязок
LR,

А что делать с selfHost.BaseAdresses? Или задание базового адреса(ов) не обязательно? Вообще, толком не понимаю что с этими адресами делать! Как я думал раньше адреса конечных точек равны BaseAdress + адрес точки, указанный в методе selfHost.AddServiceEndpoint. Но если BaseAdresses это массив, то как система определит, к какому именно базовому адресу добавлять адрес из selfHost.AddServiceEndpoint? Или это будет добавлено ко всем базовым адресам и конечная точка будет доступна по всем адресам?
...
Рейтинг: 0 / 0
28.12.2010, 20:56
    #37039871
LR
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
28.12.2010, 20:58
    #37039874
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскрытие контракта о службе с помощью нескольких привязок
LRлибо полностью
в т.ч. можно ж так
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), binding, baseAddress + "MyTCPTestServices/MS");
selfHost.AddServiceEndpoint(typeof(MyServiceInterface), httpBinding, baseHttpAddress + "MyTCPTestServices/MS");

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

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

Т.е. если в точке указан полный адрес (т.е. начинающийся с имени одно из известных протоколов?) базовые адреса службы игнорируются?
...
Рейтинг: 0 / 0
28.12.2010, 21:12
    #37039889
LR
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
29.12.2010, 09:10
    #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
29.12.2010, 14:09
    #37040827
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскрытие контракта о службе с помощью нескольких привязок
а наоборот, вторая точка без первой работает?
открывается ли порт telnet-ом?
...
Рейтинг: 0 / 0
29.12.2010, 14:33
    #37040896
Lexxxxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Раскрытие контракта о службе с помощью нескольких привязок
LR,

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

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


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