Windows Vista Forums

Marshalling returned objects by reference
  1. #1


    Mike Scott Guest

    Marshalling returned objects by reference

    In Indigo, is it possible to return an instance of a type that is marshalled
    by reference so that the returned object is a proxy and calling methods on
    this object calls methods on the server?

    Something like:

    [ServiceContract]
    public interface IMyService
    {
    [OperationContract]
    IMyOtherService GetOtherService();
    }

    public interface IMyOtherService
    {
    string SayHello();
    }
    ....

    ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>( ... );
    IMyService myService = factory.CreateChannel();

    // following line should create a proxy for an instance of IMyOtherService
    on the server
    IMyOtherService otherService = myService.GetOtherService();

    // following should call the SayHello method on server object instance, i.e.
    marshalled by ref
    string s = otherService.SayHello();

    Is this possible? Or does WCF only support passing of data objects by value?

    TIA

    MikeS.




      My System SpecsSystem Spec

  2. #2


    Arkady Frenkel Guest

    Re: Marshalling returned objects by reference

    To create proxy of second interface WCF demand that will expose metadata for
    serialization of parameters and OTOH service itself have to listen for
    incoming calls. Both conditions are not implemented in the scenario you
    wrote, so IMHO that can't be done.

    On the contrary , you can define few service contracts in your WCF service
    and call their methods from the the same client

    Arkady

    "Mike Scott" <someone@microsoft.com> wrote in message
    news:%232jWgcnAHHA.4256@TK2MSFTNGP04.phx.gbl...
    > In Indigo, is it possible to return an instance of a type that is
    > marshalled by reference so that the returned object is a proxy and calling
    > methods on this object calls methods on the server?
    >
    > Something like:
    >
    > [ServiceContract]
    > public interface IMyService
    > {
    > [OperationContract]
    > IMyOtherService GetOtherService();
    > }
    >
    > public interface IMyOtherService
    > {
    > string SayHello();
    > }
    > ...
    >
    > ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>(
    > ... );
    > IMyService myService = factory.CreateChannel();
    >
    > // following line should create a proxy for an instance of IMyOtherService
    > on the server
    > IMyOtherService otherService = myService.GetOtherService();
    >
    > // following should call the SayHello method on server object instance,
    > i.e. marshalled by ref
    > string s = otherService.SayHello();
    >
    > Is this possible? Or does WCF only support passing of data objects by
    > value?
    >
    > TIA
    >
    > MikeS.
    >



      My System SpecsSystem Spec

  3. #3


    Mike Scott Guest

    Re: Marshalling returned objects by reference

    Thanks Arkady.

    If definining several contracts, wouldn't it be necessary to create several
    channels, one for each interface? In that case, wouldn't each interface (and
    therefore channel) need to connect to a different endpoint on the server?
    Using Net.Tcp, wouldn't that mean that the server would have to have
    different ports for each interface? This would be inefficient also because a
    separate connection would have to be made for each interface.

    Or is there another way?

    Cheers,

    MikeS.


    "Arkady Frenkel" <arkadyf@hotmailxdotx.com> wrote in message
    news:%23gDO2IxAHHA.4672@TK2MSFTNGP02.phx.gbl...
    > To create proxy of second interface WCF demand that will expose metadata
    > for serialization of parameters and OTOH service itself have to listen for
    > incoming calls. Both conditions are not implemented in the scenario you
    > wrote, so IMHO that can't be done.
    >
    > On the contrary , you can define few service contracts in your WCF service
    > and call their methods from the the same client
    >
    > Arkady
    >
    > "Mike Scott" <someone@microsoft.com> wrote in message
    > news:%232jWgcnAHHA.4256@TK2MSFTNGP04.phx.gbl...
    >> In Indigo, is it possible to return an instance of a type that is
    >> marshalled by reference so that the returned object is a proxy and
    >> calling methods on this object calls methods on the server?
    >>
    >> Something like:
    >>
    >> [ServiceContract]
    >> public interface IMyService
    >> {
    >> [OperationContract]
    >> IMyOtherService GetOtherService();
    >> }
    >>
    >> public interface IMyOtherService
    >> {
    >> string SayHello();
    >> }
    >> ...
    >>
    >> ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>(
    >> ... );
    >> IMyService myService = factory.CreateChannel();
    >>
    >> // following line should create a proxy for an instance of
    >> IMyOtherService on the server
    >> IMyOtherService otherService = myService.GetOtherService();
    >>
    >> // following should call the SayHello method on server object instance,
    >> i.e. marshalled by ref
    >> string s = otherService.SayHello();
    >>
    >> Is this possible? Or does WCF only support passing of data objects by
    >> value?
    >>
    >> TIA
    >>
    >> MikeS.
    >>

    >
    >



      My System SpecsSystem Spec

  4. #4


    Arkady Frenkel Guest

    Re: Marshalling returned objects by reference

    Hi, Mike!
    "Mike Scott" <someone@microsoft.com> wrote in message
    news:ew4bFi0AHHA.2328@TK2MSFTNGP02.phx.gbl...
    > Thanks Arkady.
    >
    > If definining several contracts, wouldn't it be necessary to create
    > several channels, one for each interface? In that case, wouldn't each
    > interface (and therefore channel) need to connect to a different endpoint
    > on the server? Using Net.Tcp, wouldn't that mean that the server would
    > have to have different ports for each interface?


    That will be with any type of binding not only Net.tcp
    Arkady


    >This would be inefficient also because a separate connection would have to
    >be made for each interface.
    >
    > Or is there another way?
    >
    > Cheers,
    >
    > MikeS.
    >
    >
    > "Arkady Frenkel" <arkadyf@hotmailxdotx.com> wrote in message
    > news:%23gDO2IxAHHA.4672@TK2MSFTNGP02.phx.gbl...
    >> To create proxy of second interface WCF demand that will expose metadata
    >> for serialization of parameters and OTOH service itself have to listen
    >> for incoming calls. Both conditions are not implemented in the scenario
    >> you wrote, so IMHO that can't be done.
    >>
    >> On the contrary , you can define few service contracts in your WCF
    >> service and call their methods from the the same client
    >>
    >> Arkady
    >>
    >> "Mike Scott" <someone@microsoft.com> wrote in message
    >> news:%232jWgcnAHHA.4256@TK2MSFTNGP04.phx.gbl...
    >>> In Indigo, is it possible to return an instance of a type that is
    >>> marshalled by reference so that the returned object is a proxy and
    >>> calling methods on this object calls methods on the server?
    >>>
    >>> Something like:
    >>>
    >>> [ServiceContract]
    >>> public interface IMyService
    >>> {
    >>> [OperationContract]
    >>> IMyOtherService GetOtherService();
    >>> }
    >>>
    >>> public interface IMyOtherService
    >>> {
    >>> string SayHello();
    >>> }
    >>> ...
    >>>
    >>> ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>(
    >>> ... );
    >>> IMyService myService = factory.CreateChannel();
    >>>
    >>> // following line should create a proxy for an instance of
    >>> IMyOtherService on the server
    >>> IMyOtherService otherService = myService.GetOtherService();
    >>>
    >>> // following should call the SayHello method on server object instance,
    >>> i.e. marshalled by ref
    >>> string s = otherService.SayHello();
    >>>
    >>> Is this possible? Or does WCF only support passing of data objects by
    >>> value?
    >>>
    >>> TIA
    >>>
    >>> MikeS.
    >>>

    >>
    >>

    >
    >



      My System SpecsSystem Spec

  5. #5


    Kim Johnson Guest

    Re: Marshalling returned objects by reference

    I'm new to WCF so am not sure that this applies, but I found an excellent
    article at
    http://msdn.microsoft.com/windowsvis...TremoteWCF.asp
    which discusses using a factory type of service which returns references to
    other services. The trick is to return an EndpointAddress10 from your
    GetOtherService(), and then on the client turn that into a channel. The
    article has all the messy details...


    Kim


      My System SpecsSystem Spec

  6. #6


    Arkady Frenkel Guest

    Re: Marshalling returned objects by reference

    Mike want to avoid exposing interface but methods described in the article
    don't allow that
    Arkady

    "Kim Johnson" <k_r_j@sbcglobal.net> wrote in message
    news:OG4Z7VDBHHA.1224@TK2MSFTNGP04.phx.gbl...
    > I'm new to WCF so am not sure that this applies, but I found an excellent
    > article at
    > http://msdn.microsoft.com/windowsvis...TremoteWCF.asp
    > which discusses using a factory type of service which returns references
    > to other services. The trick is to return an EndpointAddress10 from your
    > GetOtherService(), and then on the client turn that into a channel. The
    > article has all the messy details...
    >
    >
    > Kim
    >



      My System SpecsSystem Spec

Marshalling returned objects by reference problems?

Similar Threads
Thread Thread Starter Forum Replies Last Post
messages returned that were not sent by me kalk Live Mail 4 02 Oct 2008
Marshalling ArrayList Saad .NET General 0 26 Sep 2008
Objects returned from functions?? Martin Zugec PowerShell 7 07 Jul 2008
(apparent) Marshalling related problem in x64 but works in x86 d-42 .NET General 2 05 May 2008
vs2008 Add Service Reference generates Reference.cs which wont com BillInPA Indigo 3 14 Jan 2008