Pregunta

He estado dando vueltas por un tiempo y no puedo entender por qué puedo usar la configuración para agregar referencias a los tipos conocidos o cómo depurarlo. Cualquier consejo puede salvar mi cordura.

Tengo un servicio WCF alojado en un servicio de Windows, y tengo un archivo de configuración para el servicio. En la configuración tengo esto:

<configuration>
...
  <system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
        <add type="My.Full.Interface.Name, My.Assembly.Name.With.No.dll">
          <knownType type="My.Full.Implementation.Class.Name, My.Assembly.Name.With.No.dll"/>              
        </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>
...
</configuration>

He intentado agregar el Version=1.0.0.0,Culture=neutral,PublicKeyToken=null Para ambas declaraciones, pero parece que no puedo hacer que el serializador del contrato de datos las recoja.

He verificado que esta clase se puede devolver (agregando un [ServiceKnownType(typeof(My.Implementation.Class))]) Y eso funciona, pero tengo otra implementación que quiero usar que esté en el ensamblaje de Anothet que cree una referencia circular si la agregué, así que no puedo usar eso.

¿Cómo puedo depurar por qué el serializador DataContract no está encontrando mi tipo? ¿O qué hay de malo en mi declaración?

¿Fue útil?

Solución 2

Por lo tanto, parece que mi problema fue que mi tipo de base es un interofce, y como los atributos conocidos solo se pueden aplicar a las clases, por eso no estaba funcionando.

Pude trabajar con él usando la sugerencia en esta respuesta

 [ServiceKnownType ("GetKnownTypes", typeof (KnownTypesProvider))] 

en el servicio Inteface y luego proporcionar una clase y un método para proporcionar los tipos:

internal static class KnownTypesProvider
    {
    public static IEnumerable<Type> GetKnownTypes (ICustomAttributeProvider provider)
        {            
        return new[] {Type.GetType ("Assembly qualified type name")};
        }
    } 

que también permitió la resolución de tipos que se encuentran en diferentes asambleas. Mientras esto funciona, no es genial, así que probablemente termine yendo a una solución que utiliza la configuración como en esta responder, o agregando el atributo SOEM a mis clases y usando eso para identificar tipos conocidos.

Otros consejos

Si está buscando una manera de depurar su servicio de Windows, puede intentar agregar la línea System.Diagnostics.Debugger.Break(); en el inicio del servicio. No sé si esto es lo suficientemente temprano como para averiguar por qué la infraestructura de serialización no está recogiendo su DataContractserializer.

No puedo ver ningún error en el <system.runtime.serialization> elemento que has publicado. ¿Ha investigado el resto del archivo exe.config para errores semánticos?

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