all groups > dotnet remoting > august 2007 >
You're in the

dotnet remoting

group:

return from server only works for built-in types


return from server only works for built-in types Jakob E. Madsen
8/27/2007 1:44:02 PM
dotnet remoting:
The _r.Execute Method always works, no problem (see below).
But when I call _r.GetStatistics() the client fails with the exception shown
below.

It all works if I run the client and the server on the same network, but the
GetStatistics fails when client and server is on different networks. I am
calling the server this way from the client

ro.ri _r =
(ro.ri)Activator.GetObject(typeof(ro.ri),"http://www.webserver.com:1236/s");

And
string str = _r.Execute("test command"); // <-- Works
ro.Statistics stats = _r.GetStatistics(); // <-- Fails

It seems like it fails when my custom object is returned, but not when int
or string
is returned from the server. As if two-way only works for built-in types. I
GetStatistics() call actually makes it to the server and the server does not
receive any errors.

Any help much appreciated.

Thanks & have a great day,
Jakob


===


My interface for the remoting object

using System;
using System.Collections.Generic;
using System.Text;

namespace ro
{

public interface Statistics
{
int CallsServedCtr {get;}
string TheStory {get;}
}

public interface ri
{
string Execute(string Command);
Statistics GetStatistics();
}
}

It is implemented this way on the server side

using System;
using System.Collections.Generic;
using System.Text;

namespace s
{
[Serializable]
class rii : MarshalByRefObject, ro.ri
{
protected Server _server = null;

public override object InitializeLifetimeService()
{
return null;
}

public rii()
{
_server = s.Server.TheForm;
}

public string Execute(string Command)
{
_server.CallsServed++;
return Command + " was executed, all went just fine";
}

public ro.Statistics GetStatistics()
{
_server.CallsServed++;
StatisticsImplmentation stats = new
StatisticsImplmentation(_server);
return stats;
}

}

[Serializable]
class StatisticsImplmentation : MarshalByRefObject, ro.Statistics
{

public StatisticsImplmentation(Server server)
{
_callsServedCtr = server.CallsServed;
_theStory = "Ok, here's story as of " +
DateTime.Now.ToLongTimeString();

}

private int _callsServedCtr;
public int CallsServedCtr
{
get { return _callsServedCtr; }
set { _callsServedCtr = value; }
}

private string _theStory;
public string TheStory
{
get { return _theStory; }
set { _theStory = value; }
}

}
}


Exception on client.


See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.Net.WebException: Unable to connect to the remote server --->
System.Net.Sockets.SocketException: A connection attempt failed because the
connected party did not properly respond after a period of time, or
established connection failed because connected host has failed to respond
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot,
SocketAddress socketAddress)
at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure,
Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState
state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
--- End of inner exception stack trace ---

Server stack trace:
at System.Net.HttpWebRequest.GetRequestStream()
at
System.Runtime.Remoting.Channels.Http.HttpClientTransportSink.ProcessAndSend(IMessage msg, ITransportHeaders headers, Stream inputStream)
at
System.Runtime.Remoting.Channels.Http.HttpClientTransportSink.ProcessMessage(IMessage
msg, ITransportHeaders requestHeaders, Stream requestStream,
ITransportHeaders& responseHeaders, Stream& responseStream)
at
System.Runtime.Remoting.Channels.SoapClientFormatterSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage
reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&
msgData, Int32 type)
at ro.Statistics.get_TheStory()
at c.Client.GetStatistics_Click(Object sender, EventArgs e) in
C:\Remoting1\c\Client.cs:line 87
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons
button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg,
IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.832 (QFE.050727-8300)
CodeBase:
file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
c
Assembly Version: 1.0.0.0
Win32 Version: 1.0.0.0
CodeBase: file:///C:/Data/Remoting1/c/bin/Debug/c.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.832 (QFE.050727-8300)
CodeBase:
file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.832 (QFE.050727-8300)
CodeBase:
file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.832 (QFE.050727-8300)
CodeBase:
file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.832 (QFE.050727-8300)
CodeBase:
file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.832 (QFE.050727-8300)
CodeBase:
Re: return from server only works for built-in types Joel Lyons
8/29/2007 9:19:07 AM
I'm not sure if this is related to the exception you are receiving, but it
seems kind of odd that your StatisticsImplmentation (which is spelled
incorrectly by the way :) ) is marked serializable AND inherits from
MarshalByRefObject. Do you want GetStatistics to return an instance of a
StatisticsImplmentation back to the caller or just a reference to a
StatisticsImplmentation that still lives on the server? If an object you
are returning inherits from MarshalByRefObject, then only a reference will
be returned to the caller (thus the name: "Marshal By Reference Object").

I'm guessing you want to return a serialized copy of the new
StatisticsImplmentation back to the caller. I would remove the
MarshalByRefObject base class from StatisticsImplmentation and try that.

Hope that helps
Joel

[quoted text, click to view]
Re: return from server only works for built-in types Jakob E. Madsen
8/29/2007 11:16:00 AM
[quoted text, click to view]

Hi Joel,

It helped thanks. I seemed to be midway between returning a serialized
statistics object
to the client and keeping a remotable statistics object on the server end.
I'll choose a poison
and that should change the nature of my problem at least.

I'll try to go for slize & return, but I have a feeling I might need to
"publish" the object
implementation (of that class at least) to both server and client then.
Possibly even version and sign the
assembly, make the class really 'wellknown' to relevant players and all
kinds of fun stuff.
I'll dig into that over the weekend.

Thanks again for your fast reply,
Jakob
AddThis Social Bookmark Button