Laden...

WCF-Client bekommt Fehlermeldung

Erstellt von Runshak vor 9 Jahren Letzter Beitrag vor 9 Jahren 6.420 Views
R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren
WCF-Client bekommt Fehlermeldung

Hallo,

ich habe ein Programm geschrieben um WCF zu testen (einen client der vom server was holt)

der Server gibt "service ist bereit" aus
und der Client holt sich beim Server "hallo ..." ab...

mit localhost funktioniert das auch schön...jetzt wollte ich das ganze auf zwei anderen rechnern laufen lassen zum testen ob es überhaupt so funktioniert wie ich mir das dachte...
also habe ich das Framework auf 4.0 gesetzt und auf x86 kompatibel gemacht...und die app.config so geändert, dass anstatt

endpoint address="http://localhost:2121/HelloService"

jetzt die ip drin steht

endpoint address="http://192.168.[...]:2121/HelloService"

...wäre das so in ordnung oder muss man hierbei dann die ip anders eintragen?...

das ganze soll auf nem windows server 2003 laufen...(als vm) ich hab deswegen das framework 4.0 dort installiert und meine anwendung daraufhin geändert...auch ans 32bit system hab ich gedacht...der server startet auch und gibt "service ist bereit" aus...aber der client auf der anderen vm startet gibt ne fehlermeldung (die man nicht lesen kann weils fenster sofort wieder geschlossen wird) aus und beendet sich dann wieder...meine vermutung war jetzt, dass es an der änderung von localhost zu der ip-adresse liegt...habt ihr mir tipps oder lösungen?

danke für Hilfe

C
2.121 Beiträge seit 2010
vor 9 Jahren

Die IP ist so schon ok. Probleme könnten durch Firewall & Co. entstehen, wenn nicht auf den Server zugegriffen werden kann.

Wer schließt das Fenster sofort wieder?
Der Client ist von dir? Dann passe den doch so an dass er die Meldung länger zeigt oder wohin schreibt und dass er sonstige Debugausgaben macht mit denen du das nachvollziehen kannst. Exceptions abfangen nicht vergessen.

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

ja der Client (ist wie der Server ne consolenanwendung...nur zum testen...später dann schöner) und sowohl der client und der Server sind so aufgebaut, dass sie sich nicht von selber schließen, sondern warten bis der user was macht...die fehlermeldung wird jetzt im Clientfenster angezeigt...und dann schließt sich das fenster sofort...ich hab es zwar geschafft, dass ich nen screenshot bekomme...aber die fehlermeldung ist länger und somit ist der text nicht komplett drauf...nur der untere teil ist sichtbar...das wichtige oben fehlt...

ich habe es jetzt nochmal komplett neu gemacht...und jetzt wird mir ne fehlerliste in visual studio angezeigt...(nachdem ich das projekt x86 und framework 4.0 kompatibel gemacht habe)

die fehler beziehen sich alle auf die app.config datei...

dort steht

<?xml version="1.0"?>
<configuration>
<system.serviceModel> (<- Das globale Element 'configuration' wurde bereits deklariert

    &lt;bindings&gt;  
        &lt;basicHttpBinding&gt;  
            &lt;binding name=&quot;HelloServiceHttpendpoint&quot;/&gt;  
        &lt;/basicHttpBinding&gt;  
    &lt;/bindings&gt;  
    &lt;client&gt;  
        &lt;endpoint address=&quot;http://192.168.[...]:2121/HelloService&quot; binding=&quot;basicHttpBinding&quot; bindingConfiguration=&quot;HelloServiceHttpendpoint&quot; contract=&quot;IHelloService&quot; name=&quot;HelloServiceHttpendpoint&quot;/&gt;  
    &lt;/client&gt;        (&lt;- Das globale Element &#39;location&#39; wurde bereits deklariert
&lt;/system.serviceModel&gt;  

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

diese Fehler sind erst jetzt aufgetaucht...aber ich hab keine Ahnung wie ich die beheben kann, weil ich quasi ja nur die ip-adresse eingefügt habe...Aber die Fehler tauchen in der app.config von Client und Host auf...

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

oder muss ich die Endpoint-Konfiguration ändern? wenn ich ne ip drin hab und das ganze nicht mehr lokal laufen lasse???...falls ja wie?...

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

Habe jetzt das ganze auf zwei win7 Rechnern getestet und konnte dort die Fehlermeldung per Screenshot fangen...

Fehlermeldung ist im Anhang

muss ich die ipadressen anders vergeben?...ich hab das so verstanden, dass der client die ip vom pc braucht, auf dem der server läuft...und der server ebenfalls diese hat...oder ist das völlig falsch???

16.828 Beiträge seit 2008
vor 9 Jahren

Vermutlich hast Du nicht verstanden, wie die Bindings funktionieren.
Windows Communication Foundation Bindings Overview

Wieso die Fehler bei Dir auftauchen ist aus den spärlichen Informationen und der unformatierten Config, die Du zeigst, so nicht ersichtlich.
Wie hostest Du den WCF? Integriert, auf dem Webserver?
Wie sieht die ganze Config aus? Wie sind die tatsächlichen Adressen (ipconfig). etc etc.

Lies Dir aber zuerst den WCF Binding Artikel durch.
Wenn Du alles so machst, wie es im Config-Teil steht, darf kein Fehler mehr existieren.

C
2.121 Beiträge seit 2010
vor 9 Jahren

Vergleiche die config Dateien eines funktionierenden Systems mit denen wo es nicht funtioniert. Da ist bestimmt noch ein anderer Unterschied als die IP.
Nimm die des localhost (die funktionierende) für das Clientsystem. Dann muss ein Fehler kommen, die Gegenstelle konnte nicht gefunden werden. Am Aufbau der Datei an sich darf da nicht gemeckert werden.

Die Meldung aus deiner Konsole bezieht sich auf das contract Attribut, dann wäre es sinnvoll die Suche an dieser Stelle zu beginnen. Wird IHelloService im Client gefunden? Vielleicht muss hier der komplette Namespace von IHelloService mit angegeben werden. Dann würd mich aber wundern dass es bei localhost funktioniert.

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

ich kann euch gern mal alles hier rein hauen...

mein Problem ist halt, dass ich nicht vestehe warum es nicht funktioniert...wenn ich die ip von meinem pc drin stehen habe und den server und auch den client lokal laufen lasse funktioniert es...wenn ich den client jetzt auf nen anderen pc packe und dort laufen lasse kommt der fehler...was muss ich ändern? (firewall war beim test aus)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ServiceBehaviorMeta">
                    <serviceMetadata httpGetEnabled="true" httpGetUrl="http://10.202.4.128:2121/HelloService/meta" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="ServiceBehaviorMeta" name="HalloWCF_Service.HelloService">
                <endpoint address="http://10.202.4.128:2121/HelloService" binding="basicHttpBinding"
                    bindingConfiguration="" name="HelloServiceHttpendpoint" contract="HalloWCF_Service.IHelloService" />
            </service>
        </services>
    </system.serviceModel>
</configuration>

das ist die app.config vom server...muss ich dann das Binding vllt zu einem TCP-Binding ändern damit es so geht wie ich es gemacht habe mit der ip-Adresse? (bei httpGetUrl= ...)

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

also gut...der fehler von s.o. ist behoben... (nur der Fehler, welcher in der Console steht, besteht noch)

ich poste jetzt meinen kompletten code und hoffe, dass mir irgendjemand hier helfen kann...

Der Client soll auf nem anderen PC laufen und auf meinen zugreifen und sich dort vom Service ne Nachricht abholen...
mit localhost funktioniert es...

Service

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace TCPBinding
    {
    class HelloService : IHelloService
    {
    #region IHelloService Member
    public string DoIt()
    {
    return "Hallo WCF-User";
    }
    #endregion
    }
    }
using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ServiceModel;
    using System.Text;
    using System.Threading.Tasks;
    namespace TCPBinding
    {
    [ServiceContract]
    interface IHelloService
    {
    [OperationContract]
    string DoIt();
    }
    }
using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.ServiceModel;
    using System.Text;
    using System.Threading.Tasks;
    namespace TCPBinding
    {
    class Program
    {
    static void Main(string[] args)
    {
    using (ServiceHost sh = new ServiceHost(typeof(HelloService)))
    {
    sh.Open();
    Console.WriteLine("Service bereit...");
    Console.ReadLine();
    }
    }
    }
    }


    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
    <behaviors>
    <serviceBehaviors>
    <behavior name="ServiceBehaviorMeta">
    <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:2321/HelloService/meta" />
    </behavior>
    </serviceBehaviors>
    </behaviors>
    <services>
    <service behaviorConfiguration="ServiceBehaviorMeta" name="TCPBinding.HelloService">
    <endpoint address="net.tcp://[ip von meinem pc]:2121/HelloService" binding="netTcpBinding"
    bindingConfiguration="" name="HalloServiceTCPEndpoint" contract="TCPBinding.IHelloService" />
    </service>
    </services>
    </system.serviceModel>
    </configuration>

jetzt zum Client...

mit svcutil erzeugte Proxy-Klasse

    //------------------------------------------------------------------------------
    // <auto-generated>
    // Dieser Code wurde von einem Tool generiert.
    // Laufzeitversion:4.0.30319.18444
    //
    // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
    // der Code erneut generiert wird.
    // </auto-generated>
    //------------------------------------------------------------------------------
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="IHelloService")]
    public interface IHelloService
    {
    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHelloService/DoIt", ReplyAction="http://tempuri.org/IHelloService/DoItResponse")]
    string DoIt();
    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IHelloService/DoIt", ReplyAction="http://tempuri.org/IHelloService/DoItResponse")]
    System.Threading.Tasks.Task<string> DoItAsync();
    }
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public interface IHelloServiceChannel : IHelloService, System.ServiceModel.IClientChannel
    {
    }
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public partial class HelloServiceClient : System.ServiceModel.ClientBase<IHelloService>, IHelloService
    {
    public HelloServiceClient()
    {
    }
    public HelloServiceClient(string endpointConfigurationName) :
    base(endpointConfigurationName)
    {
    }
    public HelloServiceClient(string endpointConfigurationName, string remoteAddress) :
    base(endpointConfigurationName, remoteAddress)
    {
    }
    public HelloServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
    base(endpointConfigurationName, remoteAddress)
    {
    }
    public HelloServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
    base(binding, remoteAddress)
    {
    }
    public string DoIt()
    {
    return base.Channel.DoIt();
    }
    public System.Threading.Tasks.Task<string> DoItAsync()
    {
    return base.Channel.DoItAsync();
    }
    }

  using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.ServiceModel;
    namespace TCPBindingClient
    {
    class Program
    {
    static void Main(string[] args)
    {
    HelloServiceClient hsc = new HelloServiceClient();
    Console.WriteLine(hsc.DoIt());
    hsc.Close();
    Console.ReadLine();
    }
    }
    }

ebenfalls mit svcutil erzeugte app.config

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <system.serviceModel>
    <bindings>
    <netTcpBinding>
    <binding name="HalloServiceTCPEndpoint" />
    </netTcpBinding>
    </bindings>
    <client>
    <endpoint address="net.tcp://[ip von meinem pc]:2121/HelloService" binding="netTcpBinding"
    bindingConfiguration="HalloServiceTCPEndpoint" contract="IHelloService"
    name="HalloServiceTCPEndpoint">
    <identity>
    <userPrincipalName value="MM\Musterle" />
    </identity>
    </endpoint>
    </client>
    </system.serviceModel>
    </configuration>

Ich hoffe ihr könnt damit alle was anfangen...
das meiste das ich im Netz gefunden habe ist mit localhost (was ja bei mir problemlos funktioniert)
oder nicht problemspezifisch...

Mein Gedanke war, dass ich beim Client in der app.config die Ip austausche durch die des anderen PCs...brachte aber ebenfalls nichts...

-Was überseh ich, dass es nicht wie gewünscht läuft?
-fehlt mir noch was grundlegendes?
-muss ich bei der Konfiguration noch was dazu schreiben, damit es funktioniert?

...die Firewall an meinem PC war während des Tests ausgeschaltet

16.828 Beiträge seit 2008
vor 9 Jahren

Wie gesagt, ich hab Dir den Rat gegeben, dass Du Dich ordentlich mit den Bindings beschäftigen sollst.
Wenn ich mir contract="IHelloService" anschauen, was laut Deinem Code contract="TCPBinding.IHelloService" sein sollte, hast Du das immer noch nicht getan.

Nimm Dir Tutorials zur Hand, wenn Dir das nicht schnell genug geht.
How to: Host WCF in a Windows Service Using TCP lässt sich prima auch ohne Service umsetzen.
Oder auch How to: Host a WCF Service in a Managed Application oder Self-hosting WCF Services

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

ich hab keine ahnung was daran falsch sein könnte...

Ich hab das NetTcpBinding ausgewählt, da es meiner Meinung nach zu dem passt, was ich realisieren möchte...

Eine sichere und optimierte Bindung, die sich für die computerübergreifende Kommunikation zwischen WCF-Anwendungen eignet.

das passt doch so oder etwa nicht?

und in IHelloService ist doch der contract definiert...oder muss ich dann dort andere Attribute setzen??...

Ich versteh wirklich nicht was ich mir zum Thema Binding auf der verlinkten Seite noch anschauen soll?!...

Das Binding braucht ja nur zwei Dinge...Protokoll und wie wird codiert...und NetTcpBinding codiert Binär und TCP als Protokoll hat es auch...also sind doch die wichtigsten Dinge erledigt...jedenfalls für mein Verständnis...

vllt kannst du mir das was du mir sagen willst (mit dem contract und dem binding), näher erleutern...ich versteh beim besten Willen nicht was ich damit anfangen soll...

A
350 Beiträge seit 2010
vor 9 Jahren

Probier doch mal dem Standardbinding einfach keinen Namen zu geben.
Wir hatten auch mal das Problem, dass er die Config nicht gezogen hat.

Grüße
Ahri

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

name löschen hat keine auswirkung auf mein problem

16.828 Beiträge seit 2008
vor 9 Jahren

Warum nimmst Du keinen Rat an? Keine Lust?
Was ich gezeigt hab ist, dass zum Beispiel der Namespace zum Service in der Config schon nicht stimmt.

Nimm Dir ein Tutorial an die Hand, beginne von 0 ein Test-WCF und mache es genauso wie in einem Tutorial.
Die Menschen, die solche Tutorials machen, machen das ja nicht aus Spaß sondern aus Ehrgeiz und Hilfe für andere. Sie machen, dass sodass man nicht ständig das Thema neu aufwärmen muss 😉
Du aber willst jetzt auf biegen und brechen den Fehler finden - egal was es kostet. Und weil Du es nicht findest wälzt Du das jetzt mehr oder weniger auf uns ab.
Und mit aller Gewalt etwas durch zu boxen hat in der Entwicklung noch nie funktioniert.

Beginn einfach von 0 und mach ein sauber geführtes Tutorial statt hier jetzt mit der Brechstange alles zu versuchen.
Manchmal kann es so leicht sein.

Siehe auch [Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

Ich hab das ganze als tutorial angefangen...das tutorial war nicht das einzige welches ich mir angeschaut habe...aber sie waren alle mit localhost...und das was ich hier habe stammt aus dem letzten tutorial naja eher aus nem buch welches ich mir extra gekauft habe...wenn es in diesem Buch so steht gehe ich davon aus, dass das stimmt und nicht falsch ist...anscheinend lag ich da falsch

und nein ich will mein Problem nicht auf andere abwältzen...ich versteh nur nicht was an meinem code falsch sein könnte...da ich die angaben zum namespace aus einem Buch habe...

...aber ich bin trotzdem dankbar für deine mühe...auch wenn du nicht sehr begeisterst klingst...

[edit] und wenn der namespace falsch sei...warum funktioniert es dann lokal??...das dürfte ja dann schon da nicht richtig funktionieren...oder?

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

kann es vllt auch an meinem netzwerk liegen?

ich habe folgendes Tutorial ebenfalls gemacht:

WCF - Tutorial 1

es funktioniert auch prima mit localhost (wie mein projekt auch) aber wenn ich es mit ner ip von nem anderen pc versuche (wie im Tutorial beschrieben)

"Falls ihr euren Host von einem anderen Computer aus starten wollt um euer Programm auf Netzwerkfähigkeit zu testen müsst ihr nur in der App.config vom Client die neue IP eintragen. Diese ist im Tag endpoint unter address zu finden. Dort einfach Localhost mit der gewünschten IP austauschen." -Zitat aus dem Tutorial

funktioniert es ebenfalls nicht...und ich bekomme die Fehlermeldung die hier schon gepostet wurde...

2.298 Beiträge seit 2010
vor 9 Jahren

Naja dann ist halt die Frage, hast du den WCF-Server auch auf dem Zielsystem am Laufen?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

M
171 Beiträge seit 2012
vor 9 Jahren

Ist noch eine Firewall im Router aktiv? Kannst Du von beiden Rechnern aus den jeweils anderen Rechner anpingen?

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

Die Rechner sind alle im selben Netzwerk in der selben Workgroup...ich hatte immer den Server gestartet und erst dann den Client auf dem anderen Pc

[edit] Anpingen ist kein Problem, Firewall ist an beiden Rechnern ausgeschaltet gewesen

U
135 Beiträge seit 2009
vor 9 Jahren

Erreichst Du den WCF-Server über Telnet vom Client aus?

Also telnet 10.202.4.128 2121

16.828 Beiträge seit 2008
vor 9 Jahren

Runshark, ich hatte Dir eigentlich mit Absicht ein anderes Tutorial gegeben, das svcutil NICHT nutzt. Ich halte von dem Tool auch nicht so viel.
Man sieht ja, dass die automatische Generierung, die Du - wie Du gesagt hast - genutzt hast, einen falschen Namespace in der Config generiert.

Ein anderes Self-Hosting Tutorial ist WCF Tutorials: Self Hosting (zwar mit SVcUtil, aber vielleicht wird hier was angesprochen, das Du übersehen hast).

16.828 Beiträge seit 2008
vor 9 Jahren

Hier. Hab in ca. 10 Minuten einen WCF Service erstellt, der mit Net TCP arbeitet, keine Config verwendet und (bei mir) lokal, wie auch in Kommunikation mit einer Azure VM tadellos funktioniert.
Übrigens komplett ohne svcUtil.

  • Ja, man muss natürlich Host, Post und Service-Name auslagern (zB AppKeys)
  • Ja, man KANN es auch schöner umsetzen. Exemplarisch reichts aber 😉
R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

habe das problem ganz simpel gelöst...und nein es lag nicht am namespace, nicht an svcutil und dergleichen...ich hab nur nicht dran gedacht, dass die config-infos nicht in der .exe gespeichert werden...und dass man die config.exe dem client mitgeben muss...jetzt läufts...trotzdem danke für die mühe...

16.828 Beiträge seit 2008
vor 9 Jahren

Das hat Dich inhaltlich chilic übrigens in seinem ersten Post gefragt....

R
Runshak Themenstarter:in
71 Beiträge seit 2014
vor 9 Jahren

mit der antwort bin ich auf diese simple lösung nicht gekommen...da ich bis vor wenigen minuten davon ausgegangen war, dass alles in der client.exe gespeichert wird...

16.828 Beiträge seit 2008
vor 9 Jahren

Dann noch mal ab an das Kapitel "Grundlagen .NET Framework" 😉