Domanda

Vado in giro da un po 'di tempo e non riesco a capire perché posso usare la configurazione per aggiungere riferimenti a tipi noti o come eseguire il debug. Tutti i suggerimenti potrebbero salvare la mia sanità mentale.

Ho un servizio WCF ospitato in un servizio Windows e ho un file di configurazione per il servizio. Nella configurazione ho questo:

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

Ho provato ad aggiungere il Version=1.0.0.0,Culture=neutral,PublicKeyToken=null Per entrambe le dichiarazioni, ma non riesco a prenderli a prendere il serializzatore a contratto di dati.

Ho verificato che questa classe può essere restituita (aggiungendo un [ServiceKnownType(typeof(My.Implementation.Class))]) E funziona, ma ho un'altra implementazione che voglio usare che si trova nell'assemblaggio di Anothet che creerebbe un riferimento circolare se lo aggiungessi, quindi non posso usarlo.

Come posso eseguire il debug perché il serializzatore DataContract non sta trovando il mio tipo? O cosa c'è di sbagliato nella mia dichiarazione?

È stato utile?

Soluzione 2

Quindi sembra che il mio problema fosse che il mio tipo di base sia un intervallo e come gli attributi noti che possono essere applicati solo alle classi, questo è il motivo per cui non funzionava.

Sono stato in grado di aggirarlo usando il suggerimento in questa risposta

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

Sull'intenzione del servizio e quindi fornire una classe e un metodo per fornire i tipi:

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

che ha anche consentito la risoluzione di tipi che si trovano in diversi assiemi. Mentre funziona non è eccezionale, quindi probabilmente finirò per andare a una soluzione che utilizza la configurazione come in questo Rispondere, o aggiungendo attributo SOEM alle mie classi e utilizzandolo per identificare i tipi noti.

Altri suggerimenti

Se stai cercando un modo per eseguire il debug del tuo servizio Windows, potresti provare ad aggiungere la linea System.Diagnostics.Debugger.Break(); all'avvio del servizio. Non so se questo sia sufficientemente presto per scoprire perché l'infrastruttura di serializzazione non sta raccogliendo il tuo datacontracttratserializer.

Non riesco a vedere alcun errore in <system.runtime.serialization> Elemento che hai pubblicato. Hai studiato il resto del file ex.config per errori semantici?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top