Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
.Net Remoting -Fehler?
11.08.2006
myCSharp.de - Member



Dabei seit:
Beiträge: 310

Themenstarter:

.Net Remoting -Fehler?

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3953
Herkunft: Mauer

Falsches Protokoll

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
11.08.2006
myCSharp.de - Member



Dabei seit:
Beiträge: 310

Themenstarter:

beantworten | zitieren | melden

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.

.
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3953
Herkunft: Mauer

Begleitlektüre

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
11.08.2006
myCSharp.de - Member



Dabei seit:
Beiträge: 310

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3953
Herkunft: Mauer

Konfiguration

beantworten | zitieren | melden

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> 
private Nachricht | Beiträge des Benutzers
11.08.2006
myCSharp.de - Member



Dabei seit:
Beiträge: 310

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3953
Herkunft: Mauer

Verbindung

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
11.08.2006
myCSharp.de - Member



Dabei seit:
Beiträge: 310

Themenstarter:

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3953
Herkunft: Mauer

Protokolle

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
11.08.2006
myCSharp.de - Member



Dabei seit:
Beiträge: 310

Themenstarter:

beantworten | zitieren | melden

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


???
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3953
Herkunft: Mauer

beantworten | zitieren | melden

Sieht das etwa wie TCP aus??
Zitat
Original von 11.08.2006
<add key="reference" value="http://localhost:4223/FlightAdd" />

...

<channel ref ="http"/>

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?
private Nachricht | Beiträge des Benutzers