Служба WCF хоста с замком Виндзор за пределами IIS только с кодом - PullRequest
1 голос
/ 30 июля 2010

Я пытаюсь разместить службу WCF в консольном приложении, используя Castle-Windsor 2.5 (.NET 4) со следующим кодом:

        new WindsorContainer()
            .AddFacility<WcfFacility>()
            .Register(
            Component.For<IMyService>().ImplementedBy<MyService>()
                          .ActAs(new DefaultServiceModel()
                                             .AddEndpoints(
                                             WcfEndpoint.BoundTo(new BasicHttpBinding()).At("http://localhost:1010/MyService"),
                                             WcfEndpoint.BoundTo(MetadataExchangeBindings.CreateMexHttpBinding()).At("http://localhost:1010/MyService/mex"))
                                         ));

У меня нет и я предпочитаю не иметь никаких настроек в моем app.config для WCF, если это возможно.

Однако, похоже, это не работает (не жалуется, но WcfTestUtil не видит сервис).

Я что-то упустил?

Ответы [ 3 ]

3 голосов
/ 22 августа 2010

Опубликовал вопрос в Castle Google Groups и получил намного лучшую обратную связь, но, поскольку SO более дружелюбен к Google, чем Google Groups (ирония!), Я опубликую здесь ссылку для ответа для других: http://groups.google.com/group/castle-project-users/browse_thread/thread/d670d8f1d7aae0ab

1 голос
/ 26 сентября 2014

Я использую wcfFacility 3.3.0 и размещаю dll службы wcf в службе Windows. Это регистрация рабочего компонента для меня: (добавьте Hosted ())

public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.AddFacility<LoggingFacility>(f => f.UseLog4Net());

        container
            .AddFacility<WcfFacility>(f =>
            {
                f.CloseTimeout = TimeSpan.Zero;
            });


        string baseAddress = "http://localhost:8744/TVIRecorderWcfService/";

        container.Register(

            Component
                .For<ITVIRecorderWcfService>()
                .ImplementedBy<TVIRecorderWcfService>()
                .AsWcfService(
                new DefaultServiceModel()
                    .AddBaseAddresses(baseAddress)
                    .Hosted()
                    //publish metadata doesn't work, have to do differently
                    //.PublishMetadata(x => x.EnableHttpGet()).Discoverable()
                    .AddEndpoints(WcfEndpoint
                        .BoundTo(new BasicHttpBinding()))
                        //.PublishMetadata(x=>x.EnableHttpGet()).Discoverable()
                        ).LifestyleSingleton()
                        ,

            Component
                .For<ServiceBase>()
                .ImplementedBy<TVIRecorderService>());
    }

Чтобы увидеть утилиту WcfTestClient,служба должна публиковать свои serviceMetadata Мне нужно вручную добавить serviceBehaviour и MetadataExchangeBindings после создания экземпляра моей ServiceHost

var binding = MetadataExchangeBindings.CreateMexHttpBinding();
var mexAddress = "http://localhost:8744/TVIRecorderWcfService/mex";
var behaviour = new ServiceMetadataBehavior() {HttpGetEnabled = true};


serviceHost.Description.Behaviors.Add(behaviour);
serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, mexAddress);
1 голос
/ 05 марта 2013

Основываясь на ссылке Хаша из групп Google, вот минимальный код для этой работы:

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    container
        .AddFacility<WcfFacility>()
        .Register(
            Component.For<ICoreService>()
            .ImplementedBy<CoreService>()
            .AsWcfService(new DefaultServiceModel()
                .AddBaseAddresses("http://localhost:1000/core")
                .AddEndpoints(WcfEndpoint.BoundTo(new BasicHttpBinding()))
                    .PublishMetadata(o => o.EnableHttpGet()))
    );
}
...