2010-02-24 9 views
2

J'utilise des fichiers de configuration côté client pour un client .NET Remoting et leconfig client .NET Remoting crée un objet local, et non à distance

RemotingConfiguration.Configure() 

se termine avec succès. J'ai référencé la bibliothèque où les objets distants sont définis dans mon client. Le problème que j'ai est qu'après la configuration, quand j'essaye de créer un objet distant using new(), il crée juste un objet local de la DLL référencée. Qu'est-ce que je fais mal?

Merci,

+0

n'ont pas la réponse, mais avez-vous gérer le posibility de goingto WCF plutôt sur .net Remoting? – sebagomez

Répondre

0
if(!typeof(MarshallByRefObject).IsAssignableFrom(typeof(MyRemoteObject)) 
    throw new InvalidOperationException(@"If a type doesn't extend MBRO, it is 
    marshalled by value. Make sure MyRemoteObject extends MBRO."); 
+0

Hi Will, L'objet distant que j'appelle étend MarshalByRefObject. Cependant, quand je fais RemotingConfiguration.Configure ("file.config"); MyRemoteObject x = new MyRemoteObject(); Tout ce que je reçois est un objet local qui est construit sur la machine locale. Merci encore, – azarias

+0

@aza tobsen vous avez sur celui-ci. – Will

3

Sur le site client, vous devez appeler

IYourRemoteObjectInterface remoteObj = 
(IYourRemoteObjectInterface)Activator.GetObject(typeof(IYourRemoteObjectInterface), 
"tcp://remotehost:1002/Test"); 

afin de récupérer un objet proxy à distance à partir d'un serveur qui est configuré comme ceci:

<configuration> 
<system.runtime.remoting> 
    <application name="server"> 
    <service> 
    <activated type="remote.ServiceClass, serviceclassassembly"/> 
    </service> 
    <channels> 
    <channel ref="tcp" port="1002"> 
    <serverProviders> 
     <formatter ref="binary" typeFilterLevel="Full"/> 
    </serverProviders> 
    <clientProviders> 
     <formatter ref="binary"/> 
    </clientProviders> 
    </channel> 
    </channels> 
    </application> 
</system.runtime.remoting> 
</configuration> 

Peut-être que vous devriez lire quelques tutorials pour .net remoting afin d'apprendre la diff es entre les objets Client et Serveur activé et entre les instances singlecall et singleton.

+0

Le problème est lié à l'utilisation des créations new() de style "normal", et non de la construction Activator.GetObject. Merci encore. – azarias

+0

(Et en utilisant un fichier de configuration côté client pour y parvenir). – azarias

+0

Si vous utilisez newConcreteClass(); le cadre distant n'a aucune chance de l'intercepter et n'a aucun moyen de fournir un objet proxy distant. Si vous souhaitez que votre application cliente ne soit pas consciente de l'infrastructure d'accès distant, vous devez soit utiliser une fabrique qui encapsule la création d'objets distants, soit jeter un coup d'œil au support d'accès distant de spring.net (par exemple Spring.Remoting.SaoExporter, http://www.springframework.net/doc-latest/reference/html/remoting.html#remoting-publishsao). – tobsen

1

Un problème est survenu dans votre fichier de configuration. Votre assemblage est probablement incorrect. Par exemple, si votre fichier de configuration ressemble à ceci:

<configuration> 
    <system.runtime.remoting> 
    <application> 
     <client> 
     <wellknown 
      type="Foo.MyService, WRONGASSEMBLY" 
      url="tcp://localhost:33000/MyServiceUri" /> 
     </client> 
    </application> 
    </system.runtime.remoting> 
</configuration> 

Tout va compiler et exécuter, mais vous utiliserez une copie locale de l'objet au lieu de la copie à distance. L'assembly dans le fichier de configuration doit être l'assembly dans lequel réside votre objet. Ainsi, si vous placez l'objet dans un assembly commun et que vous le référencez, l'assembly commun sera l'assembly souhaité. Si vous n'avez pas envie de créer un assemblage commun, vous pouvez même inclure le fichier source qui contient votre objet dans les deux projets, mais, et c'est un peu surprenant, l'assemblage que vous mettez dans le fichier de configuration sera votre CLIENT assembly (pas le serveur). En d'autres termes, l'assembly mentionné dans le fichier de configuration indique à .NET quel objet de votre code doit être redirigé vers un emplacement distant, ce n'est PAS l'emplacement de l'objet (c'est la raison pour laquelle "url" est utilisé). "namespace.typename, assembly" décrit complètement l'objet afin que remoting puisse basculer l'objet new call en proxy.

Il y a quelques bons exemples ici: http://www.codeproject.com/KB/WCF/net_remoting.aspx