2008-08-08 12 views
7

Estoy empezando a crear algunos servicios WCF, pero tengo un requisito para hacerlos compatibles con versiones anteriores para aplicaciones heredadas (.NET 1.1 y 2.0).WCF Service - Problema de compatibilidad con versiones anteriores

He logrado que los servicios se ejecuten correctamente para clientes 3.0 y mayores, pero cuando publico los servicios usando un punto de acceso basicHttpBinding (que creo que es necesario para la compatibilidad que necesito), el servicio refactoriza mis firmas de métodos . p.ej.

public bool MethodToReturnTrue(string seedValue); 

parece que las aplicaciones cliente como

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

He probado todos los parámetros de configuración que se me ocurre en el app.config para mi aplicación de consola autoalojamiento, pero me parece que no puede para hacer esta función como se esperaba Supongo que esto podría llevar al hecho de que mis expectativas son erróneas, pero me sorprendería que un servicio WCF no sea capaz de manejar un tipo de retorno bool para un cliente de nivel inferior.

Mi app.config actual tiene este aspecto.

<?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 aconsejarle, por favor?

Respuesta

3

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

Baiscally, todo lo que hicimos fue agregar un servicio web ASMX tradicional al proyecto, y llamé al servicio WCF desde allí usando llamadas WCF nativas. Luego pudimos devolver los tipos apropiados a las aplicaciones del cliente sin una cantidad significativa de trabajo de refaccionamiento. Sé que era una solución hacky, pero era la mejor opción que teníamos con una base de código heredada tan grande. Y la ventaja añadida es que realmente funciona sorprendentemente bien. :)

3

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

Recuerdo, sin embargo, que necesita basicHttpBinding, y no puede usar el nuevo serializador (que es el predeterminado); tienes que usar el "viejo" XmlSerializer.

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

0

Tienes que usar el 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); 
} 

Hay que establecer manualmente el nombre de la acción operación porque el nombre de WCF generada automáticamente se construye de manera diferente del nombre de la acción ASMX (WCF incluye el nombre de la interfaz, así, ASMX no lo hace).

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

Su archivo de configuración no debería tener que cambiar.

Cuestiones relacionadas