Pregunta

Recién estoy empezando a crear algunos servicios WCF, pero tengo el requisito de hacerlos compatibles con versiones anteriores de aplicaciones cliente heredadas (.NET 1.1 y 2.0).

Logré que los servicios se ejecutaran correctamente para clientes 3.0 y superiores, pero cuando publico los servicios usando un punto final basicHttpBinding (que creo que es necesario para la compatibilidad que necesito), el servicio refactoriza las firmas de mis métodos.p.ej.

public bool MethodToReturnTrue(string seedValue);

aparece en las aplicaciones cliente como

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

Probé todos los parámetros de configuración que se me ocurren en app.config para mi aplicación de consola de autohospedaje, pero parece que no puedo hacer que esta función funcione como se esperaba.Supongo que esto podría llevar al hecho de que mis expectativas sean erróneas, pero me sorprendería que un servicio WCF sea incapaz de manejar un tipo de retorno bool a un cliente de nivel inferior.

Mi app.config actual se ve así.

<?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>

¿Alguien puede aconsejarme, por favor?

¿Fue útil?

Solución 2

Bien, necesitábamos resolver este problema en el corto plazo, por lo que se nos ocurrió la idea de una "interoperabilidad" o capa de compatibilidad.

Básicamente, todo lo que hicimos fue agregar un servicio web ASMX tradicional al proyecto y llamar al servicio WCF desde allí mediante llamadas WCF nativas.Luego pudimos devolver los tipos apropiados a las aplicaciones cliente sin una cantidad significativa de trabajo de refactorización.Sé que fue una solución complicada, pero era la mejor opción que teníamos con una base de código heredado tan grande.Y la ventaja adicional es que funciona sorprendentemente bien.:)

Otros consejos

¡Ah, esto me está matando!Hice esto en el trabajo hace unos 3 meses y ahora no recuerdo todos los detalles.

Sin embargo, recuerdo que necesitas basicHttpBinding y no puedes usar el nuevo serializador (que es el predeterminado);tienes que usar el "antiguo" XmlSerializer.

Desafortunadamente, ya no trabajo en el lugar donde hice esto, así que no puedo ver el código.Llamaré a mi jefe y veré qué puedo desenterrar.

Tienes que usar XmlSerializer.Por ejemplo:

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

Debe configurar manualmente el nombre de la acción de la operación porque el nombre WCF generado automáticamente se construye de manera diferente al nombre de la acción ASMX (WCF también incluye el nombre de la interfaz, ASMX no).

Cualquier contrato de datos que utilice debe estar decorado con [XmlType] en vez de [DataContract].

No debería ser necesario cambiar su archivo de configuración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top