2010-11-24 21 views
14

Tengo un servicio WCF que devuelve una clase que implementa IExtensibleDataObject. Necesito agregar un nuevo campo a esta clase. Actualicé la interfaz de DataContract e hice el cambio a la clase. Ahora, cuando trato de ejecutar mi aplicación cliente me sale el siguiente error:¿Agregar campo al contrato de datos de WCF rompe clientes?

Could not load file or assembly 'xxx.yyyy.zzzz, Version=1.3.9.26111, Culture=neutral, PublicKeyToken=b09e2f3e9b5894f0' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

El AssemblyVersion de la clase CFM ha cambiado - hace que el cliente descanso?

EDIT:

hay clientes en la producción que utilizan este servicio. No quiero hacerles actualizar su referencia de servicio y volver a implementar sus clientes para este simple cambio si es posible.

Respuesta

25

que depende de cómo se haya configurado el contrato de datos.

En WCF, utilizando todos los valores predeterminados, su servicio utilizará el DataContractSerializer (DCS) para serializar su objeto en XML. El DCS serializará sus campos en orden, primero los públicos, luego los privados. Dentro de cada grupo de visibilidad, ordenará los campos/propiedades alfabéticamente por nombre.

Por lo tanto, si se introduce una nueva propiedad pública MiddleName y ya tenía FirstName y LastName, que estaría bien: el viejo XML habría sido

<YourObject> 
    .... 
    <FirstName>.....</FirstName> 
    <LastName>.....</LastName> 
</YourObject> 

y su nuevo uno podría simplemente añadir un nuevo propiedad al final:

<YourObject> 
    .... 
    <FirstName>.....</FirstName> 
    <LastName>.....</LastName> 
    <MiddleName>....</MiddleName> 
</YourObject> 

Dicha actualización "añadir algo al final" debería funcionar bien, el DCS simplemente ignorar las etiquetas adicionales en el XML.

Sin embargo: había que presenten una propiedad llamada Gender, que se pegó entre<FirstName> y <LastName> y que por lo tanto romper el orden de los datos en el XML y por lo tanto sería romper el contrato de datos - no "viejo" cliente ser capaz de llamar a su nuevo servicio.

Con el fin de tomar el control de esto, se puede poner Order= atributos específicos de miembros de datos en su contrato de datos:

[DataContract] 
public class SomeAddress 
{ 
    [DataMember(Order=0)] 
    public string FirstName; 

    [DataMember(Order=1)] 
    public string LastName; 
} 

A continuación, fácilmente podría añadir una nueva propiedad - sólo tiene que añadir al final de ¡la lista!

[DataContract] 
public class SomeAddress 
{ 
    [DataMember(Order=0)] 
    public string FirstName; 

    [DataMember(Order=1)] 
    public string LastName; 

    [DataMember(Order=2)] 
    public string Gender; 
} 

Así mediante el uso del atributo Order= en sus contratos de datos, se puede tomar el control de su diseño de XML, y usted puede hacer simples extensiones de contratos de datos existentes actualizaciones de no separación.

Para obtener más información y conocimientos profundos, debe leer Serialization in Windows Communication Foundation en el sitio web de la revista MSDN, muy recomendable.

+0

Voy a intentar esto, pero ¿es el error esperado la versión "No se pudo cargar el ensamblado" que estoy obteniendo? – HitLikeAHammer

+0

Eso lo hizo. No cambié el orden de ningún miembro existente, pero agregué Order = 2 a los nuevos miembros. La próxima versión tendrá Order = 3 en todos los miembros nuevos y así sucesivamente. – HitLikeAHammer

1

de su servicio de menú de contexto de referencia elegir ... "Update Service Reference"

+1

Sí, eso funcionará, sin embargo, tengo otros clientes en producción. Me gustaría evitar que todos tengan que recompilar y volver a implementar, especialmente si no necesitan el nuevo campo. – HitLikeAHammer

Cuestiones relacionadas