“L'objet a été déconnecté ou n'existe pas sur le serveur” exception
J'ai besoin d'utiliser de la croix-domaine d'application les appels dans mon application, et parfois, j'ai cette RemotingException:
Objet '/2fa53226_da41_42ba_b185_ec7d9c454712/ygiw+xfegmkhdinj7g2kpkhc_7.rem' a été déconnecté ou n'existe pas sur le serveur.
L'objet cible est encore en vie, j'ai vérifié.
UPD j'ai mis un point d'arrêt dans le finaliseur de l'objet cible, et il n'est jamais arrivé. Ainsi, cet objet est vivant et n'a pas été GC ed.
Vous devez vous connecter pour publier un commentaire.
C'est probablement parce que le local garbage collector sur le côté serveur recueille l'objet. Vous pouvez empêcher que, par le renouvellement de la location. Vous pouvez lire plus à ce sujet dans les articles suivants:
Mise à jour: Malheureusement, la MSDN Magazine questions à partir de 2008 ou plus ne sont plus consultable en ligne, mais seulement comme .fichiers chm que vous devez télécharger sur votre machine locale. Les problèmes précédents peuvent être trouvées dans:
C'est parce que la gestion de durée de Vie sur le serveur déconnecte l'objet lors de son expiration du bail, afin de permettre GC pour les recueillir. Si vous essayez de l'utiliser à partir du côté client, vous aurez une Exception, même si elle n'a pas été GC avais sur le serveur (par exemple, parce qu'il est encore une autre référence), mais le bail a expiré. C'est pour éviter des comportements imprévisibles. La accepté de répondre fournit une bonne référence sur la façon de gérer correctement la durée de vie de la Télécommande .NET des Objets.
J'ai eu le même problème et j'ai cherché pendant de nombreuses heures avec l'aide de beaucoup de StackOverflow postes.
J'ai enfin trouvé le numéro complet.
Voici l'explication complète et cas d'utilisation :
Ma classe "Loader" hérite de MarshalByRefObject, et je les garde en vie avec un ISponsor classe. Je sais que "ClientSponsor" existe dans .NET, mais je n'avais aucun moyen de déterminer si et quand Renouvellement() est appelée, j'ai donc fait ma classe avec l'aide de StackOverflow de la communauté (lire les commentaires dans le code) :
Et ensuite, j'ai utilisé cette "coutume commanditaire", comme ceci:
La PluginProxy type a une référence vers le réel du type de plugin. En effet, la PluginProxy est instanciée à l'intérieur de Plugin domaine d'application, et est retourné à principal domaine d'application, afin de permettre à appeler les Plugins, même si l'on ignore leur type réel. Ainsi, le PluginProxy, pour être accessible à partir d'principal domaine d'application, doivent être sérialisé à la croix domaines d'application des limites. J'ai eu un problème car je n'ai pas commandité ces MarshalByRefObject(s) :
Il était difficile tas de problèmes à résoudre, espérons que cette aide !
Références:
StackOverflow: Remoting commanditaire cesse d'être appelé
StackOverflow: Comment les ISponsor et ILease interfaces de travail?
Ce qui s'est passé pour nous, car nous avons eu une variable statique dans l'une de nos classes de type domaine d'application. La classe a été utilisé dans un long cours d'exécution de windows service.
Domaine d'application a un InitializeLifetimeService méthode qui doit être substituée comme ceci:
Nous étions constamment en utilisant ce que la variable privée de chargement et de déchargement des dll pour personnalisé construit en dehors de la logique.
La réponse a été pris à partir d'ici: msdn répondre
Parce que nous n'avons pas été en mesure de changer cela au moment de la production, nous nous sommes retrouvés avec un compromis de redémarrer le service windows à des intervalles aléatoires qui sont plus courtes que la durée de vie de la statique domaine d'application variable qui, par essais et erreurs, nous avons trouvé qu'il est de plusieurs jours.
Cette question a également permis de clarifier certaines choses à propos de la durée de vie: stackoverflow-question
dans mon cas, le problème était que, dans l'ordinateur client, il y a une carte réseau virtuelle active, la désactivation des cartes réseau virtuelles, le problème a été résolu
Dans mon cas, ce qui se passait avec SQL LocalDB stockées dans
App_Data
dossier à l'intérieurWeb
projet. Chaque fois que j'essaie d'utiliser la Console pour exécuterupdate-database
à init de mon Entity Framework de base de données à l'aide de migrations, rien ne se passe. Puis, après un certain temps, je reçois cette erreur.J'ai résolu ce problème grâce à la révision des autorisations de fichiers sur
App_Data
. Une fois fixé, le tour est joué, il a travaillé.Cette question a été répondu en détail déjà sur StackOverflow. TL/DR:
InitializeLifetimeService
renvoie une valeur nullClientSponsor
pour vous garder objet en vie plus longtemps.