Я застрял несколько дней на разработке немного сложно. Объяснение:Принимать несколько конечных точек с одним и тем же контрактом, но изменять в runtimme
Функциональная необходимость: Предоставлять уникальную услугу с различными типами привязок, которые имеют один и тот же контракт И переключатель во время выполнения, который привязан к использованию в функции клиентов (это .Net-клиент, используйте net.tcp - если клиент Java, используйте http binding).
Вот что я в моем Config файл:
<!-- Test Service -->
<service name="TestService.v1.TestServiceImplementation, TestService" behaviorConfiguration="MyBehavior">
<endpoint name="TestServiceV1Htpp" contract="ITestService.v1" address="http://localhost:6001/TestService/v1" binding="basicHttpBinding" bindingConfiguration="HttpConf" behaviorConfiguration="HttpSOAPBehavior"/>
<endpoint name="TestServiceV1NetTcp" contract="ITestService.v1" address="net.tcp://localhost:6002/TestService/v1" binding="customBinding" bindingConfiguration="TcpConfStream" behaviorConfiguration="TcpSOAPBehavior"/>
</service>
TestService DataContract:
[ServiceContract(...)]
public interface ITestService : IDisposable
{
[OperationContract]
IEnumerable<string> GetData();
}
[ServiceBehavior(...)]
public class TestServiceImplementation : ITestService
{
public IEnumerable<string> GetData()
{
yield return "Pong";
}
}
И мой "во время выполнения" модификации контракта (в поведении конечных точек, с целью подделать полученный результат):
public sealed class CustomBehavior : IEndpointBehavior
{
void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
foreach (var msg in endpoint.Contract.Operations.First().Messages)
{
var part = msg.Body.ReturnValue;
if (part != null)
part.Type = typeof(Stream);
}
}
}
Исполнение:
Все работает отлично, если я не использую свой CustomBehavior. Когда я добавляю его в конфигурацию поведения моей конечной точки TCP (TcpSOAPBehavior), модификатор Body.ReturnValue.Type изменяется и изменяется эта модификация ВСЕ контракт моей конечной точки (даже http ...). Хотя я просто хочу изменить контракт конечной точки TCP, не касайтесь HTTP-протокола ... Возможно ли сделать такую модификацию? Или тезисы конечных точек предназначены для того, чтобы разделить навсегда один и тот же контракт?