Следуя образцу для compression от Microsoft. Я добавил кодер, фабрику кодировщика и привязывающий элемент к моему решению. Отличие от их выборки заключается в том, что мы не регистрируем наши конечные точки через файл конфигурации (требование), а вместо этого используем настраиваемую Factory Host Factory.Конфигурация WCF для сжатия
узел службы:
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost host = base.CreateServiceHost(serviceType, baseAddresses);
if (host.Description.Endpoints.Count == 0)
{
host.AddDefaultEndpoints();
}
host.Description.Behaviors.Add(new MessagingErrorHandler());
return host;
}
Так что я попытался это добавить пользовательские привязки к моей конечной точке, но зарегистрировать конечную точку, с привязкой, похоже, я должен использовать AddServiceEndpoint
, но это потребует интерфейс, который неизвестен. Я знаю, что могу получить все интерфейсы, которые реализует serviceType, и делать getInterfaces()[0]
, но это, кажется, небезопасный подход ко мне. Итак, есть способ зарегистрировать мою конечную точку с пользовательской привязкой и не знать интерфейс, или, может быть, лучший подход, который я должен принять.
Моя попытка добавления пользовательских привязки:
CustomBinding compression = new CustomBinding();
compression.Elements.Add(new GZipMessageEncodingBindingElement());
foreach (var uri in baseAddresses)
{
host.AddServiceEndpoint(serviceType, compression, uri);//service type is not the interface and is causing the issue
}
Можете ли вы пояснить, почему интерфейс неизвестно? Возможно, я я не понял, но кажется, что вы либо определяете конечную точку службы (так что должен иметь интерфейс), либо нет - поэтому не нужно связывать. – Basic
serviceType может иметь несколько интерфейсов, поэтому я не знаю, какой из этих интерфейсов для назначения конечной точке –
Гораздо яснее, спасибо – Basic