Laden...

.Net Remoting -Fehler?

Erstellt von 11.08.2006 vor 17 Jahren Letzter Beitrag vor 17 Jahren 7.763 Views
1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren
.Net Remoting -Fehler?

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?

3.728 Beiträge seit 2005
vor 17 Jahren
Falsches Protokoll

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

1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren

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.

.

3.728 Beiträge seit 2005
vor 17 Jahren
Begleitlektüre

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?

1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren

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.

3.728 Beiträge seit 2005
vor 17 Jahren
Konfiguration

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> 
1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren

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?

3.728 Beiträge seit 2005
vor 17 Jahren
Verbindung

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?

1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren

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)

3.728 Beiträge seit 2005
vor 17 Jahren
Protokolle

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.

1
11.08.2006 Themenstarter:in
310 Beiträge seit 2006
vor 17 Jahren

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);  

???

3.728 Beiträge seit 2005
vor 17 Jahren

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?