Нужен ли мне файл svc для настройки функции Castle Wcf для служб, отличных от HTTP

#wcf #castle-windsor #castle #net.tcp #wcffacility

#wcf #замок-Виндзор #castle #net.tcp #wcffacility

Вопрос:

Меня смущает регистрация объекта castle wcf.

Я прочитал несколько сообщений в блоге для BasicHttpBinding. Но не удалось найти четкий простой пример для настройки настройки net.tcp.

Я хочу разместить службу из консольного приложения…

Я написал что-то вроде этого … вы видите здесь проблему?

 _container = new WindsorContainer();
_container.AddFacility<WcfFacility>();

_container.Register(Component.For<IMembershipService>().ImplementedBy<MembershipService>()
    .AsWcfService(
        new DefaultServiceModel()
            .AddEndpoints(WcfEndpoint
                    .BoundTo(new NetTcpBinding() { PortSharingEnabled = false })
                    .At("net.tcp://localhost/MembershipService")
            )
            .PublishMetadata()
    )
);
  

Ответ №1:

Если вы хотите опубликовать метаданные, вам нужно будет включить совместное использование портов (чтобы конечная точка MEX использовала тот же порт, что и обычный TCP-порт — вы получите исключение AddressAlreadyInUse, если для этого параметра установлено значение false), и вам, вероятно, нужно указать порт в своем URL (не уверен, какой порт TCPиспользовал бы в противном случае), поэтому ваш код должен быть (при условии, что порт 8080 подходит для вас):

 _container.Register(Component.For<IMembershipService>().ImplementedBy<MembershipService>()
    .AsWcfService(
        new DefaultServiceModel()
            .AddEndpoints(WcfEndpoint
                    .BoundTo(new NetTcpBinding() { PortSharingEnabled = true})
                    .At("net.tcp://localhost:8080/MembershipService")
            )
            .PublishMetadata()
    )
);
  

Это отлично работает с использованием castle windsor 3.0.

Комментарии:

1. Имейте в виду возможность, когда пользователю не разрешено использовать совместное использование портов. У меня была эта проблема, я получил исключение CommunicationException с подсказкой, что я могу отредактировать раздел allowAccounts в файле SMSvcHost.exe.config, чтобы позволить пользователю это сделать. Но это решение невыполнимо, потому что файл находится в C:WindowsMicrosoft.NET … Мое решение до сих пор: удалите конечную точку Mex / PublishMetadata(). Я опубликую метаданные со второй конфигурацией привязки, если это потребуется в будущем.

2. О, и до того, как у меня была отключена «Служба общего доступа к портам Net.Tcp» в моих службах Windows. У вашего конечного пользователя это тоже может быть отключено, и ему может быть запрещено его включать (а включение с помощью установщика — не лучший вариант)