Domanda

Abbiamo appena trovato stiamo ottenendo “ inquadrando errori ” (come riportato dai registri di WCF) durante l'esecuzione il nostro sistema su qualche macchina di prova del cliente.

Tutto funziona bene sulle nostre macchine di sviluppo.

Abbiamo una classe base astratta, con attributi KnownType per tutte le sue classi secondarie. Uno di esso è sottoclasse manca è dell'attributo DataContract.

Comunque tutto si è risolto sulla nostra macchina di prova!

Sulla macchina i clienti di prova, abbiamo ottenuto “errore di framing” che mostra i registri di WCF, questo non è il messaggio di errore che ho visto in passato, quando manca un attributo DataContract, o un attributo KnownType .

  

Vorrei andare a fondo di questa,   come non possiamo più avere fiducia in   la nostra capacità di testare il sistema prima   dando al cliente fino a quando possiamo   rendere le nostre macchine si comportano un po 'come   le macchine del cliente.


Il codice che cerchiamo di mostrare ciò di cui sto parlando, (non il codice vero e proprio)

    [DataContract()]
    [KnownType(typeof(SubClass1))]
    [KnownType(typeof(SubClass2))] 
    // other subclasses with data members
    public abstract class Base
    {
        [DataMember]
        public int LotsMoreItemsThenThisInRealLife;
    }

    /// <summary>
    /// This works on some machines (not not others) when passed to Contract::DoIt, 
    /// note the missing [DataContract()]
    /// </summary>
    public class SubClass1 : Base
    {
        // has no data members
    }

    /// <summary>
    /// This works in all cases when passed to Contract::DoIt
    /// </summary>
    [DataContract()]
    public class SubClass2 : Base
    {
        // has no data members
    }

    public interface IContract
    {
        void DoIt(Base[] items);
    }

    public static class MyProgram
    {
        public static IContract ConntectToServerOverWCF()
        {
            // lots of code ...
            return null;
        }

        public static void Startup()
        {
            IContract server = ConntectToServerOverWCF();

            // this works all of the time
            server.DoIt(new Base[]{new SubClass2(){LotsMoreItemsThenThisInRealLife=2}});

            // this works "in develperment" e.g. on our machines, but not on the customer's test machines! 
            server.DoIt(new Base[] { new SubClass1() { LotsMoreItemsThenThisInRealLife = 2 } });
        }
    }

Aggiornamento Mi è stato detto di .NET 3.5 SP1 è in tutti le macchine, ho ancora comfirm questo per me stesso.

È stato utile?

Soluzione 2

Credo che il problema è che alcuni della macchina non ha avuto 3.5 SP1 su di loro.

Altri suggerimenti

Abbiamo avuto un problema simile: un file è stato correttamente i dati del contratto deserializzazione su tutte le nostre macchine di test. Tuttavia, su una particolare macchina del cliente, non è riuscito con l'errore

  

NomeClasse non può essere serializzato. Prendere in considerazione la marcatura con l'attributo DataContractAttribute, e la marcatura di tutti i suoi membri desiderati serializzato con l'attributo DataMemberAttribute.

Si scopre che il cusotmer era in esecuzione .NET Framework 3.0, mentre tutti i nostri test è stato fatto su .NET Framework 3.5 SP1.

Sembra che il comportamento del serializzatore contratto di dati è diversa dall'altra parte .NET Framework 3.0 e .NET Framework 3.5. Sul 3.5, se una classe è serializzabile XML, allora è automaticamente i dati del contratto serializzabile anche. Tuttavia, questo non è il caso di .NET Framework 3.0 -. La classe è da decorare con [DataContract] o [Serializable]

Spero che questo aiuti!

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