Question

Ce problème a été résolu


C'est un contrat que je ne suis pas en mesure d'obtenir à partir d'un appel de service:

[DataContract]
public class myInitializationData : ClientInitializationData
{
    [DataMember]
    public Dictionary<string, string> CultureNameLookup { get; set; }
}

Ici, c'est le type de base,

[DataContract]
public class ClientInitializationData
{
    [DataMember]
    public List<IServiceType> ServiceTypes { get; set; }
}

IServiceType est une interface.Je me rends compte que je ne peut pas envoyer une interface à travers le fil.Il y a un EntityFramework entité, ServiceType, la mise en œuvre de la IServiceType interface:

public partial class ServiceType : IServiceType
{
    //...
}

Mon objectif est d'envoyer ServiceType entités à travers le câble via le myInitializationData contrat.

Je suis empêché de la décoration de la myInitializationData ou ClientInitializationData classes avec un KnownType de ServiceType, parce que ces classes sont partagés (liés) à Silverlight projet(s).Donc, si j'ai décorer l'une de ces classes avec un KnownType de ServiceType, le Silverlight côté(s) échoue à compiler.

Au lieu de décorer directement les classes, j'ai décoré le contrat de service avec un ServiceKnownType de ServiceType:

[ServiceContract]
[ServiceKnownType(typeof(ServiceType))]
public interface IService
{
    [OperationContract]
    myInitializationData InitializeClient();
}

Si cela fonctionne?

Lors de l'appel IService.InitializeClient, J'ai l'erreur suivante sur le client:

There was an error reading from the pipe: The pipe has been ended. (109, 0x6d).

Je l'ai activé trace de débogage mais pas trouvé de messages concernant le manque de sérialiser dans la trace pour le client ou le serveur.

La trace du serveur:

  • Reçoit un message jamais un canal (Action: http://tempuri.org/IService/InitializeClient)
  • Pour:Exécuter (IService.InitializeClient)
  • De:Exécuter (IService.InitializeClient)
  • Envoie un message sur un canal (Action: http://tempuri.org/IService/InitializeClientResponse)
  • Avertissement Reproché Au Système.ServiceModel.Les canaux.ServerSessionPreambleConnectionReader+ServerFramingDuplexSessionChannel
  • Avertissement Reproché Au Système.ServiceModel.Les canaux.ServiceChannel
  • Répondant à une opération a généré une exception (L'instance de ObjectContext a été éliminé et ne peut plus être utilisé pour les opérations qui nécessitent une connexion.)

Suivi du Client:

Si je choisis l' ServiceTypes propriété de la ClientInitializationData DataContract, cette erreur disparaît.Donc je suppose que ce doit être un problème de sérialisation re:l'interface et KnownTypes, mais WCF n'est pas en prétendant avoir toute la sérialisation dans la trace, et je ne suis pas sûr de ce que la trace signifie dans ce cas.


Solution

Ce n'était pas une KnownTypes question.C'est le résultat de LazyLoading avoir été spontanément activé sur l'entité contexte de la définition de la ServiceType type.

Bien qu'il n'y est fait aucune mention de l'excessive message ou une taille de mémoire tampon violés dans la trace (sur le client ou le serveur côtés), je dois assumer l'activation de LazyLoading sur le contexte EF causé le DataContractSerializer pour déclencher EF dans l'extraction de beaucoup de dossiers, qui à son tour entraîné dans un massif graphique en cours de (tentative de) sur le fil.Le serveur était tout simplement (et de manière ambiguë) défaillant la chaîne pendant le message à écrire.

De retour LazyLoading à un état désactivé sur le contexte EF a depuis réglé ce problème.

Était-ce utile?

La solution

Ce n'était pas une KnownTypes question.C'est le résultat de LazyLoading avoir été spontanément activé sur l'entité contexte de la définition de la ServiceType type.

Bien qu'il n'y est fait aucune mention de l'excessive message ou une taille de mémoire tampon violés dans la trace (sur le client ou le serveur côtés), je dois assumer l'activation de LazyLoading sur le contexte EF causé le DataContractSerializer pour déclencher EF en récupérer un grand nombre d'enregistrements, qui à son tour entraîné dans un massif graphique en cours de (tentative de) sur le fil.Le serveur était tout simplement (et de manière ambiguë) défaillant la chaîne pendant le message à écrire.

De retour LazyLoading à un état désactivé sur le contexte EF a depuis réglé ce problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top