channelsink error caused by issue with memorystream object passing accross remoting boundary

channelsink error caused by issue with memorystream object passing accross remoting boundary

Old forum URL: forums.lhotka.net/forums/t/3395.aspx


phillipjohnson posted on Friday, August 17, 2007

Hi,

I am using CSLA set up to use dotnet remoting with a binary formatter.

I have a property that returns a memorystream that has had a file loaded
into it.

When I try to access this property though I get an error regarding "the
proxy has no channel sink....[]...or no suitable Client channel to talk to
the server."

I have investigated a bit and have come to the conclusion that the
memorystream object can itself be serialized with a binary formatter, but
when it is deserialized it throws an exception stating that

"End of Stream encountered before parsing was completed."

Can anybody suggest a way around this, or indeed a different way than the
memorystream to pass file data trhough remoting boundaries using the
binaryformatter?

In case its of use, this is the code I used to try out my
serialize/deserialize test...

// SEEMS TO SERIALIZE ok BUT THROWS AN ERROR ON DESIERIALIZE!!!!
BinaryFormatter objSerializer = new BinaryFormatter();
BinaryFormatter objDeserializer = new BinaryFormatter();
FileStream fst = File.OpenRead(Path.GetFullPath(file));
System.IO.MemoryStream objStream = GetMemoryStream(fst);
System.IO.MemoryStream objSerializedStream = new System.IO.MemoryStream();
objSerializer.Serialize(objSerializedStream, objStream);
System.IO.MemoryStream objReturnStream = new System.IO.MemoryStream();
try
{
 //objReturnStream =
(MemoryStream)(objDeserializer.Deserialize(objSerializedStream));
 object objDeserialisedFile =
objDeserializer.Deserialize(objSerializedStream);
}
catch(Exception ex)
{
 MessageBox.Show("Exception: " + ex.Message);
}

--

I originally posted my problem at http://forums.lhotka.net/forums/thread/16892.aspx which might be of use to people who are picking this up, but I felt that the problem had now been identified so it was worth posting a new, more specific thread.


Regards,

Phil Johnson

phillipjohnson replied on Friday, August 17, 2007

I added this call to set the memory stream back to the start before it was deserialized and it showed that the memorystream can indeed be serialised and deserialised by the binary formatter.

objSerializedStream.Seek(0, SeekOrigin.Begin);

SO does anybody have any idea why my remoting is failing on the property
that exposes a MemoryStream object?

I can set the property itself to a memory stream object on the client, but
in the next line when I try to get the data out of the object I get this
error:

Error
====
This remoting proxy has no channel sink which means either the server has no
registered server channels that are listening, or this application has no
suitable client channel to talk to the server.

StackTrace
===========
Server stack trace:
   at
System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(IMethodCallMessage reqMcmMsg, Boolean useDispatchMessage, Int32 callType)
   at System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(IMessage reqMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&
msgData, Int32 type)
   at System.IO.Stream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.MemoryStream.WriteTo(Stream stream)
   at
System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(MethodBase
mb, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext,
Object[]& outArgs)\r\n   at
System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage
msg, Int32 methodPtr, Boolean fExecuteInContext)\n\nException 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 System.IO.MemoryStream.WriteTo(Stream stream)
   at ConsoleApplication1.Class1.SaveMemoryStream(MemoryStream ms, String
FileName) in
c:\\hexagon\\hexagon.mycontainer\\consoleapplication\\class1.cs:line 160
   at ConsoleApplication1.Class1.Main(String[] args) in
c:\\hexagon\\hexagon.mycontainer\\consoleapplication\\class1.cs:line
85" string

Copyright (c) Marimer LLC