Perché stiamo ottenendo un WCF “errore di Framing” su alcune macchine, ma non altri
-
25-09-2019 - |
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.
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'attributoDataMemberAttribute
.
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!