Я понял это. Ранее я включал HttpGet в MetaData, используя следующий код:
var metadata = new ServiceMetadataBehavior { HttpGetEnabled = true };
container.Register(Component.For<IServiceBehavior>().Instance(metadata));
Который следовал за кодом в этом примере с github .
Кажется, что этот подход заставляет WcfFacility совместно использовать метаданные для всех сервисов по любому запросу get.
Решение было простым. Сначала удалите это. Во-вторых, настройте каждый компонент службы следующим образом
Component.For<IAttributeService>()
.ImplementedBy<AttributeService>()
.AsWcfService(
new DefaultServiceModel()
.Hosted()
.PublishMetadata(x => x.EnableHttpGet())
.AddBaseAddresses(new Uri(baseUri, "AttributeService.svc"))
.AddEndpoints(
WcfEndpoint.ForContract<IAttributeService>().BoundTo(new BasicHttpBinding()).At("Soap11"),
WcfEndpoint.ForContract<IAttributeService>().BoundTo(new WSHttpBinding()).At("Soap12")
)
),
В частности, хитрость заключалась в том, чтобы добавить этот код .PublishMetadata(x => x.EnableHttpGet())
в каждый компонент.
Теперь я вижу ожидаемое поведение для каждого сервиса.
Редактировать: Как только я начал работать, я начал работать над удалением вещей, которые могут или не могут потребоваться - мне нравится соглашение по конфигурации. Вот результат, кажется, больше ничего не отнять. Хорошая вещь в этом заключается в том, что я могу рефакторинг дальше в общую регистрацию для всех услуг, вместо того, чтобы нуждаться в одной регистрации для каждой. Просто делюсь товарами.
Component.For<IAttributeService>()
.ImplementedBy<AttributeService>()
.AsWcfService(
new DefaultServiceModel()
.Hosted()
.PublishMetadata(x => x.EnableHttpGet())
.AddEndpoints(
WcfEndpoint.BoundTo(new BasicHttpBinding()).At("Soap11"),
WcfEndpoint.BoundTo(new WSHttpBinding()).At("Soap12")
)
),
А вот и общая регистрация.
Classes.FromThisAssembly()
.Where(t => Attribute.IsDefined(t, typeof(StandardServiceAttribute)))
.WithService.Select((t, _) => t.GetInterfaces().Where(i => Attribute.IsDefined(i, typeof(ServiceContractAttribute),false)))
.Configure
(cr =>
cr.AsWcfService(
new DefaultServiceModel()
.Hosted()
.PublishMetadata(x => x.EnableHttpGet())
.AddEndpoints(
WcfEndpoint.BoundTo(new BasicHttpBinding()).At("Soap11"),
WcfEndpoint.BoundTo(new WSHttpBinding()).At("Soap12")
)
)
)