2013-12-10 2 views
1

Я застрял несколько дней на разработке немного сложно. Объяснение:Принимать несколько конечных точек с одним и тем же контрактом, но изменять в 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-протокола ... Возможно ли сделать такую ​​модификацию? Или тезисы конечных точек предназначены для того, чтобы разделить навсегда один и тот же контракт?

ответ

0

После нескольких дней работы я нашел решение. У меня было это сообщение об ошибке:

«Сообщение InnerException было« Тип »System.Collections.Generic.List`1 [[System.String]] 'с именем контракта данных« ArrayOfValuationResult_testService_wsdl »не ожидается. Добавить любые типы, известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных DataContractSerializer. "."

Я использовал ServiceKnownTypeAttribute на интерфейс, как в этом блоге: http://blogs.msdn.com/b/youssefm/archive/2009/04/21/understanding-known-types.aspx

Таким образом, я могу разоблачить IEnumerable, но превратить его в поток и есть вызов успеха с TCP/Http как обязательные.