Håller på att utveckla en applikation som kommunicerar med en windows service (på samma maskin). Kommunikationen sker med hjälp av Remoting. Stack trace: <B>"Breakar man efter krachen ser man att den fastnat när gör dett anropet till en metod i remoting objektet."</B> Kraschar den precis efter anropet eller tar det några sekunder efter att anropet påbörjats tills att den kraschar? (Har lite svårt att hitta något i din kod som ser kraschbenäget ut :/ ) Det är lite svårt att svara på eftersom det inte är varje gång som den krashar, Hej!Remotingstrul?
Allt fungerar som det skall, förutom att Remotingen krachar ibland med följande felmeddelande:
"An unhandled exception of type 'System.Runtime.Remoting.RemotingException' occurred in mscorlib.dll
Additional information: Underlying socket was closed."
Breakar man efter krachen ser man att den fastnat när gör dett anropet till en metod i remoting objektet.
Efter en veckas letande på nätet och skruvande i koden har jag troligtvis inte kommit närmare en lösning än vad jag var från början.
Eftersom det finns så lite information om just detta felet misstänker jag att jag antingen har missat något väldigt uppenbart eller så är felet väldigt ovanligt.
Nedan följer den mesta av min kod. Skulle bli väldigt glad om ni kunde hjälpa mig att hitta vad som är galet.
---
Remotingen startas och körs i en Windows Service, så här sätts servern upp:
BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider();
serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
BinaryClientFormatterSinkProvider clientProv = new BinaryClientFormatterSinkProvider();
IDictionary props = new Hashtable();
props["port"] = 8085;
System.Runtime.Remoting.Lifetime.LifetimeServices.LeaseTime = TimeSpan.FromSeconds(0);
System.Runtime.Remoting.Lifetime.LifetimeServices.LeaseManagerPollTime = TimeSpan.FromSeconds(0);
System.Runtime.Remoting.Lifetime.LifetimeServices.RenewOnCallTime = TimeSpan.FromSeconds(0);
System.Runtime.Remoting.Lifetime.LifetimeServices.SponsorshipTimeout = TimeSpan.FromSeconds(0);
TcpChannel chan = new TcpChannel(props, clientProv, serverProv);
ChannelServices.RegisterChannel(chan);
RemotingConfiguration.RegisterWellKnownServiceType(Type.GetType("Intro.DllRemoting.cRemoting,DllRemoting"), "SayHello", WellKnownObjectMode.Singleton);
När applikationen startar, körs följande metod för att koppla upp mot remotingen:
private void ConnectToServer()
{
BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider();
serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
BinaryClientFormatterSinkProvider clientProv = new BinaryClientFormatterSinkProvider();
IDictionary props = new Hashtable();
props["port"] = 0;
TcpChannel chan = new TcpChannel(props, clientProv, serverProv);
ChannelServices.RegisterChannel(chan);
remoteServer = (Intro.DllRemoting.cRemoting)Activator.GetObject(typeof(Intro.DllRemoting.cRemoting), "tcp://localhost:8085/SayHello");
if (remoteServer == null)
{
MessageBox.Show("Could not locate server\n Application will now exit.");
Application.Exit();
}
}
Detta är lite valda delar ur remoting klassen:
namespace Intro
{
namespace DllRemoting
{
/// <summary>
/// Summary description for CStuffToDo.
/// </summary>
public delegate void ShowLoading(string sLoadingMessage);
public delegate void HideLoading();
public delegate void AllDone(string sMessage);
/// <summary>
/// This is the class that holds the diffrent methods that the client can run on the server via remoting.
/// </summary>
[Serializable]
public class cRemoting : System.MarshalByRefObject
{
public event ShowLoading showLoadingEvent;
public event HideLoading hideLoadingEvent;
public event AllDone allDoneEvent;
private Intro.DllCommunicationPhone.cCommands obCommands;
private System.Threading.Thread obThread;
private string sFoo;
private ArrayList alFoo;
private bool IsBusy;
/// <summary>
/// Constructor.
/// </summary>
public cRemoting()
{
obCommands = null;
obThread = null;
showLoadingEvent = null;
hideLoadingEvent = null;
allDoneEvent = null;
sFoo = "";
EventLog.WriteEntry("Intro Windows Service", "Remoting Constructor");
}
public void ClearAllEvents()
{
this.allDoneEvent = null;
this.hideLoadingEvent = null;
this.showLoadingEvent = null;
}
public void TestWriteEvent(string sMessage)
{
EventLog.WriteEntry("Intro", sMessage);
}
/// <summary>
/// Starts a testing command, that lasts for 8sec.
/// Returns "Klart" when done with testing.
/// </summary>
public void StartTesting()
{
bool bServerFree = CheckWorkLoad();
if (!bServerFree)
{
return;
}
IsBusy = true;
obThread = new System.Threading.Thread(new System.Threading.ThreadStart(this.Testing));
obThread.Name = "Testing-thread";
obThread.ApartmentState = System.Threading.ApartmentState.MTA;
obTimer.Interval = 10000;
obThread.Start();
//obTimer.Start();
if (showLoadingEvent != null)
{
this.showLoadingEvent.BeginInvoke("Testar Service...",null,null);
}
}
/// <summary>
/// Method that runs in the testing thread, all it does is sleeps the thread for 8 sec.
/// </summary>
private void Testing()
{
System.Threading.Thread.Sleep(8000);
if (hideLoadingEvent != null)
{
this.hideLoadingEvent();
}
if (allDoneEvent != null)
{
this.allDoneEvent("Klart");
}
IsBusy = false;
}
}
}
}
Sv:Remotingstrul?
************** Exception Text **************
System.Runtime.Remoting.RemotingException: Underlying socket was closed.
Server stack trace:
at System.Runtime.Remoting.Channels.SocketHandler.ReadFromSocket(Byte[] buffer, Int32 offset, Int32 count)
at System.Runtime.Remoting.Channels.SocketHandler.BufferMoreData()
at System.Runtime.Remoting.Channels.SocketHandler.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.Runtime.Remoting.Channels.SocketHandler.ReadAndMatchFourBytes(Byte[] buffer)
at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16& operation)
at System.Runtime.Remoting.Channels.Tcp.TcpClientSocketHandler.ReadHeaders()
at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.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 Intro.DllRemoting.cRemoting.StartGenerateKeyLists()
at Intro.DllFormsAdministerLocks.FormChangeLock.buttonSave_Click(Object sender, EventArgs e)
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.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)Sv:Remotingstrul?
och det kan hända lite när som helst.Sv: Remotingstrul?
Sv:Remotingstrul?
men vad jag kan se så är det direkt vi anropet till metoden.Sv: Remotingstrul?
Jag håller på med ett liknande projekt (windows service som ska exponera en singleton-klass via remoting). Jag måste redan från början erkänna att jag inte har läst ingående om ditt problem, men en sak som slog mig som jag har läst om i min grundforskning avseende remoting är parametern "InitialLeaseTime" i remoting-configfilen.
Nu såg jag att du inte använder en config-fil utan kör det programmatiskt, men jag antar att man ändå kan speca "InitialLeaseTime".
Hur som helst - finessen med denna parameter (som jag tolkat / läst det) är att om man sätter den till noll (0) så kommer instansen som skapas vid första metodanropet aldrig att dö.
Vet inte om det kan hjälpa dig, men det kanske är en ledtråd iaf.