Ich habe hier eine Klasse, die einen Server implementieren soll und wüsste gerne, ob alles korrekt ist, bevor ich den Client implementiere. Wie kann ich das prüfen?
Wenn ich im Browser die URL "http://localhost:4223/FlightAdd" eintippe, bekomme ich eine Datei mit dem Inhalt "
.NETÁSystem.Runtime.Remoting.RemotingException: Tcp channel protocol violation: expecting preamble. at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16& operation) at System.Runtime.Remoting.Channels.Tcp.TcpServerSocketHandler.ReadHeaders() at System.Runtime.Remoting.Channels.Tcp.TcpServerTransportSink.ServiceRequest(Object state) at System.Runtime.Remoting.Channels.SocketHandler.ProcessRequestNow()
" zurückgegeben. Offenbar reagiert er ja schonmal auf Anfragen.
.
Ist die Methode AddFlight überhaupt bekannt, oder muss ich die bei dem WellKnown...-Kram mit angeben?
Du erzeugst TCP-Kanäle (TcpServerChannel), gibst aber in den URLs "http://..." an. Das klappt so nicht. Wenn Du mit binärer TCP Kommunikation arbeitest, musst Du auch "tcp://..." in den URLs angeben. In der Config-datei verwendest Du dann plötzlich wieder http. Willst Du jetzt über http oder über tcp kommunizieren. http ist für Remoting nicht unbegingt eine gute Wahl. Wenn Du http-Kommunikation betreiben willst, nimm WCF.
Bitte füge Kommentare in Deinen Code ein. Es ist nervig ein so großes Stück Code durchzugehen, welches völlig undokumentiert ist.
DataManager.DataManager ist eine fürchterliche Benennung. Warum nennst Du die Namensräume immer ganuso wie die Klassen?
Du solltest Geschäftslogik und Host trennen. Die Klasse FlightAdd gehört in eine separate Assembly.
Du machst zum ersten Mal was mit Remoting, oder? Schau Dir mal dieses Video an: http://www.microsoft.com/germany/msdn/nettv/folge1.mspx
Mein Prorgamm stammt aus einer Übung, die schon einen Großteil des Codes vorgibt, allerdings ist da nichts dokumentiert.
Man soll nur noch die Zeilen ergänzen, die ich mit "start/ ende eigener Code" jetzt markiert habe. Als Anleitung habe ich die Beispiele aus der Begleitlektüre genommen. Ich denke, dass es so funktionieren muss, sonst würde es dort wohl anders stehen.
.
Dem Autor dieser Lektüre gehört eins auf die Müze!
Entweder arbeite ich mit http (HttpChannel) oder mit TCP (TcpChannel). Welches Protokoll soll denn jetzt verwendet werden?
Vielleicht muss ich noch genauer erläutern, denn ich weis nicht, ob Deine Kritik berechtigt ist.
Das ganze beginnt mit einem Webservice, dessen WSDL man dann in eine CS-Datei umformt und dann mit dieser Datei ein Remoting-Projekt hochzieht.
Es sollte in etwa so aussehen:
<configuration>
<appSettings>
<add key="reference" value="tcp://localhost:4223/FlightAdd" />
</appSettings>
<system.runtime.remoting>
<application>
<channels>
<channel ref ="tcp" port="0">
<clientProviders>
<formatter ref="binary" />
</clientProviders>
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
Klappt immer noch nicht - die Verbindung kann nicht hergestellt werden.
Unhandled Exception: System.Net.WebException: Unable to connect to the remote se
rver ---> System.Net.Sockets.SocketException: Es konnte keine Verbindung hergest
ellt werden, da der Zielcomputer die Verbindung verweigerte
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddre
ss socketAddress)
at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Sock
et s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state,
IAsyncResult asyncResult, Int32 timeout, Exception& exception)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.GetRequestStream()
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodN
ame, Object[] parameters)
at FlightManager.getAirports()
at FlightClient.FlightClient..ctor()
at FlightClient.FlightClient.Main()
Woran kann das noch liegen?
Ist der Host-Prozess denn auch gestartet?
Veröffentlicht der Host die Komponente auch wirklich unter Port 4223 mit dem URI "FlightAdd"?
Am besten postest Du mal die App.config des Hosts und die des Clients.
Hast Du Dir das Video angesehen?
So ganz sicher bin ich da nicht. Wenn das Serverprogramm gestartet ist und ich im Browser die URL "http://localhost:4223/FlightAdd" eintippe, bekomme ich eine Datei mit dem Inhalt "
.NETÁSystem.Runtime.Remoting.RemotingException: Tcp channel protocol violation: expecting preamble. at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16& operation) at System.Runtime.Remoting.Channels.Tcp.TcpServerSocketHandler.ReadHeaders() at System.Runtime.Remoting.Channels.Tcp.TcpServerTransportSink.ServiceRequest(Object state) at System.Runtime.Remoting.Channels.SocketHandler.ProcessRequestNow()
" zurückgegeben. Ist das Serverprogramm aus, so bekomme ich da keine Antwort.
Eine ander Config-Datei als die angegebene und die von Dir schon korrigierte Datei habe ich nicht.
Das Video habe ich schon gesehen, allerdings gehen die ja nicht von einem Webservice aus, wie bei mir (Die Dateien habe ich Dir ja schon mal als PrivateMessage geschickt)
Natürlich bekommst Du eine Antwort, da der Host ja auf TCP-Port 4223 Client-Anfragen entgegennimmt. Aber nicht im HTTP-Protokoll, sondern im properitären .NET Remoting TCP Binary Protokoll. Deshalb bekommst Du eine Fehlermeldung "Protocol violation". Das beduetet dass Du das Kommunikationsprotokoll nicht eingehalten hast.
Du kannst mit Remoting auch HTTP verwenden. Dann musst Du das aber auch so deklarieren. Es spielt keine Rolle ob es in irgendeinem Übungs-beispielcode so steht. Es geht so einfach nicht. Entweder HTTP oder TCP binary. Der Client kann nicht HTTP verwenden, wenn der Server auf TCP binary eingestellt ist.
Du musst also entweder den Server auf HTTP-Protokoll umstellen oder den Client auf TCP binary.
Das heißt, dass das hier dann doch richtig war?
<configuration>
<appSettings>
//start eigener code
<add key="reference" value="http://localhost:4223/FlightAdd" />
</appSettings>
<system.runtime.remoting>
<application>
<channels>
<channel ref ="http"/>
</channels>
//ende eigener code
</application>
</system.runtime.remoting>
</configuration>
Aber das funktionierte ja nicht.
Ich denke, dass dann TCP-Binary genommen werden soll, wenn im Sever ein TCP-Channel aufgemacht wird. Oder was ist das passende Gegenstück zu
//start eigener code
TcpServerChannel channel = new TcpServerChannel(4223);
ChannelServices.RegisterChannel(channel, false);
???
Sieht das etwa wie TCP aus??
Original von 11.08.2006
<add key="reference" value=":::...
<channel ref =":::
Wenn Du TCP haben willst, aber http hinschreibst, geht es natürlich nicht.
Was weisst Du über TCP?
Was weisst Du über HTTP?
Was ist der Unterschied zwischen ASP.NET Webservices und .NET Remoting?