Pergunta

Estou começando a criar alguns serviços WCF, mas tenho um requisito para torná-los compatíveis com versões anteriores para aplicativos clientes legados (.NET 1.1 e 2.0).

Consegui fazer com que os serviços funcionassem corretamente para clientes 3.0 e superiores, mas quando publico os serviços usando um endpoint basicHttpBinding (que acredito ser necessário para a compatibilidade necessária), o serviço refatora minhas assinaturas de método.por exemplo.

public bool MethodToReturnTrue(string seedValue);

aparece para os aplicativos cliente como

public void MethodToReturnTrue(string seedValue, out bool result, out bool MethodToReturnTrueResultSpecified);

Tentei todos os parâmetros de configuração que consigo imaginar no app.config para meu aplicativo de console auto-hospedado, mas não consigo fazer essa função conforme o esperado.Suponho que isso possa levar ao fato de que minhas expectativas são falhas, mas ficaria surpreso se um serviço WCF fosse incapaz de lidar com um tipo de retorno bool para um cliente de nível inferior.

Meu app.config atual se parece com isso.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="MyServiceTypeBehaviors" Name="MyCompany.Services.CentreService.CentreService">
        <clear />
        <endpoint address="http://localhost:8080/CSMEX"    binding="basicHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
        <endpoint address="http://localhost:8080/CentreService" binding="basicHttpBinding" bindingName="Compatible" name="basicEndpoint" contract="MyCompany.Services.CentreService.ICentreService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Alguém pode aconselhar, por favor?

Foi útil?

Solução 2

OK, precisávamos resolver esse problema no curto prazo e então tivemos a ideia de uma “interoperabilidade”, ou camada de compatibilidade.

Basicamente, tudo o que fizemos foi adicionar um serviço da web ASMX tradicional ao projeto e chamar o serviço WCF usando chamadas WCF nativas.Conseguimos então retornar os tipos apropriados aos aplicativos clientes sem uma quantidade significativa de trabalho de refatoração.Eu sei que foi uma solução hacky, mas foi a melhor opção que tínhamos com uma base de código legada tão grande.E o bônus adicional é que ele realmente funciona surpreendentemente bem.:)

Outras dicas

Ah, isso está me matando!Fiz isso no trabalho há cerca de 3 meses e agora não consigo me lembrar de todos os detalhes.

Lembro-me, entretanto, que você precisa do basicHttpBinding e não pode usar o novo serializador (que é o padrão);você tem que usar o XmlSerializer "antigo".

Infelizmente, não trabalho mais no local onde fiz isso, então não posso ver o código.Vou ligar para meu chefe e ver o que posso descobrir.

Você precisa usar o XmlSerializer.Por exemplo:

[ServiceContract(Namespace="CentreServiceNamespace")]
[XmlSerializerFormat(Style=OperationFormatStyle.Document, SupportFaults=true, Use=OperationFormatUse.Literal)]
public interface ICentreService {
    [OperationContract(Action="CentreServiceNamespace/MethodToReturnTrue")]
    bool MethodToReturnTrue(string seedValue);
}

Você precisa definir manualmente o nome da ação da operação porque o nome WCF gerado automaticamente é construído de forma diferente do nome da ação ASMX (o WCF também inclui o nome da interface, o ASMX não).

Quaisquer contratos de dados que você usar devem ser assinados com [XmlType] em vez de [DataContract].

Seu arquivo de configuração não deve precisar ser alterado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top