none
Client: uri aus der app.config auslesen RRS feed

  • Frage

  • Hallo

    Wie beschrieben versuche ich die uri aus der folgenden app.config auszulesen:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <appSettings>
      <add key ="ServiceURI" value ="net.tcp://localhost:8080/IContracts"/>
     </appSettings>
    </configuration>
    

    Der Abruf selbst sieht so aus:

     EndpointAddress clsServiceAdresse = new EndpointAddress(ConfigurationManager.AppSettings["ServiceURI"]);
    

    Darauf hin kommt der Fehler: URI darf nicht NULL sein

    1. Warum ist sie NULL (Server läuft)?

    2. Wie kann ich das beheben,

    Danke im Voraus

    Freitag, 3. September 2010 19:09

Antworten

  • Hallo W.,

    Dein Quellcode ist vom Prinzip her ok! Gut, vielleicht die Abfrage nach null noch einfügen:

      string serviceUri = ConfigurationManager.AppSettings["ServiceURI"];
      if (serviceUri == null)
      {
        /* Fehler-Handling [...] */  return;
      }

    Beachte, dass die app.config aus dem Projekt (beim Debugging) in das Debug-Verzeichnis kopiert wird!

    Was weiterhin, was viele nicht wissen ist, dass zur Debug-Zeit normal die "DeinAsmName.vshost.exe.config" benutzt wird, wenn der Visual Studio Hosting Prozess aktiviert ist (was Standard ist).
    In jedem Fall, das sauberste ist, wenn Du eben in der app.config änderst, die im Projekt-Verzeichnis ist.


    ciao Frank
    Samstag, 4. September 2010 09:19
  • Hallo,

    grundsätzlich sähe das gut aus.
    Da der Eintrag nicht gefunden wird, kann ich nur vermuten, dass Du die falsche App.Config geändert hast.
    Berücksichtigt wird nur die des Programmes und die findet sich nach dem Erstellen im Programmverzeichnis
    (z. B. bin\Debug)  als "Programmname.exe.config".

    Ich würde an Deiner Stelle die Anwendungseinstellungen verwenden,
    die Du über die Projekteigenschaften bearbeiten kannst, siehe Seite "Einstellungen", Projekt-Designer
    Dort werden die Vorgaben automatisch erstellt, sollten sie nicht vorhanden sein.

    Gruß Elmar

    Freitag, 3. September 2010 21:52
  • Hallo W.,

    > > app.config, die im Projekt-Verzeichnis ist.
    > Sorry, das habe ich nicht verstanden, was genau soll ich in der app.config ändern??

    der Formulierung der Frage nach hast Du wahrscheinlich die app.config gar nicht als Konfigurationsdatei eingebunden, sondern vielleicht selber eine im bin/Debug-Verzeichnis erstellt o.ä., was nicht gut wäre.

    In dem Fall mache folgendes:

    Rechte Maus aufs Projekt im Projektmappenexplorer / Hinzufügen / Neues Element / Anwendungskonfigurationsdatei (Doppelklick)
    Paste dann den XML Code, den Du in Deiner Frage (oben) stehen hattes, in diese Datei, sodass nur noch dieser darin steht.
    Dann ist das Verhalten so, wie ich (wir) beschrieben haben und es sollte funktionieren.


    ciao Frank
    Sonntag, 5. September 2010 04:16

Alle Antworten

  • Hallo,

    grundsätzlich sähe das gut aus.
    Da der Eintrag nicht gefunden wird, kann ich nur vermuten, dass Du die falsche App.Config geändert hast.
    Berücksichtigt wird nur die des Programmes und die findet sich nach dem Erstellen im Programmverzeichnis
    (z. B. bin\Debug)  als "Programmname.exe.config".

    Ich würde an Deiner Stelle die Anwendungseinstellungen verwenden,
    die Du über die Projekteigenschaften bearbeiten kannst, siehe Seite "Einstellungen", Projekt-Designer
    Dort werden die Vorgaben automatisch erstellt, sollten sie nicht vorhanden sein.

    Gruß Elmar

    Freitag, 3. September 2010 21:52
  • Hallo W.,

    Dein Quellcode ist vom Prinzip her ok! Gut, vielleicht die Abfrage nach null noch einfügen:

      string serviceUri = ConfigurationManager.AppSettings["ServiceURI"];
      if (serviceUri == null)
      {
        /* Fehler-Handling [...] */  return;
      }

    Beachte, dass die app.config aus dem Projekt (beim Debugging) in das Debug-Verzeichnis kopiert wird!

    Was weiterhin, was viele nicht wissen ist, dass zur Debug-Zeit normal die "DeinAsmName.vshost.exe.config" benutzt wird, wenn der Visual Studio Hosting Prozess aktiviert ist (was Standard ist).
    In jedem Fall, das sauberste ist, wenn Du eben in der app.config änderst, die im Projekt-Verzeichnis ist.


    ciao Frank
    Samstag, 4. September 2010 09:19
  • Danke für eure Antworten:)

    Beachte, dass die app.config aus dem Projekt (beim Debugging) in das Debug-Verzeichnis kopiert wird!

    Also wenn ich meinen Client so ausführe:

     

     if (iProxy == null)
            {
    
              EndpointAddress clsServiceAdresse = new EndpointAddress(ConfigurationManager.AppSettings["ServiceURI"]);
    
            }
    

    Wird beim Debugging in zeile: if(iProxy == Null) noch keine app.config im Ordner bin/Debugging erstellt.

    und bei der nächsten Zeile springt er ins Catch. Das heisst, in dem Ordner bin/Debugging ist die App.config gar nicht vorhanden.

    In jedem Fall, das sauberste ist, wenn Du eben in der app.config änderst, die im Projekt-Verzeichnis ist.

    Sorry, das habe ich nicht verstanden, was genau soll ich in der app.config ändern??

     

     


     

     

    Samstag, 4. September 2010 10:54
  • Hallo W.,

    > > app.config, die im Projekt-Verzeichnis ist.
    > Sorry, das habe ich nicht verstanden, was genau soll ich in der app.config ändern??

    der Formulierung der Frage nach hast Du wahrscheinlich die app.config gar nicht als Konfigurationsdatei eingebunden, sondern vielleicht selber eine im bin/Debug-Verzeichnis erstellt o.ä., was nicht gut wäre.

    In dem Fall mache folgendes:

    Rechte Maus aufs Projekt im Projektmappenexplorer / Hinzufügen / Neues Element / Anwendungskonfigurationsdatei (Doppelklick)
    Paste dann den XML Code, den Du in Deiner Frage (oben) stehen hattes, in diese Datei, sodass nur noch dieser darin steht.
    Dann ist das Verhalten so, wie ich (wir) beschrieben haben und es sollte funktionieren.


    ciao Frank
    Sonntag, 5. September 2010 04:16
  • Ahh danke sehr, ihr habt mich auf die richtige Lösung gebracht, welche total kuriös ist.

    Ich hoffe, jemand weiss warum das passiert und zwar:

    Ich hab nen Server mit einer Configurationsdatei, da wollte ich diese Configurationsdatei sinnigeweise: AppServer.cofing bennen

    Als ich das tat, lief mein Server nicht mehr, als ich ihn aber als App.Config benannt habe, war alles ok....

     

    Das selbe hab ich auch mit dem Client gemacht: AppClient.config, und darum lief der Client die ganze zeit nicht

    Nur als ich die Config Datei wieder auf App.config umbenannt habe, funktioniert das jetzt einwandfrei....

    Warum kann ich nicht beliebig die Configurationsdatei umbennen???

    Sonntag, 5. September 2010 10:31
  • Hallo,

    weil nur für "App.Config" diese spezielle Behandlung eingebaut ist,
    d. h. sie wird entsprechend in AssemblyName .[exe|dll].config umbenannt
    und ins Ausgabeverzeichnis kopiert
    (und bei aktiviertem Visual Hosting Prozess dafür erzeugt).
    Wobei sich AssemblyName wiederum aus den Anwendungseinstellungen ergibt
    und .exe | .dll aus dem Ausgabetyp.

    Es gibt zwar Möglichkeiten darauf einzuwirken, z. B.:
    http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx
    Easily switching between App.Config files with MSBuild

    aber das sollte man nur aus berechtigtem Anlass tun.
    In Deinem Falle dürften zwei Projekte (für Server und Client) sauberer tun.

    Ergo: Lass den Namen, so wie er ist, um den Rest kümmert sich Visual Studio.

    Gruß Elmar

    Sonntag, 5. September 2010 10:51
  • ok..danke für die Erklärung, aber das ist echt seltsam.

    Ich hab jetzt das erste mal App.config erstellt, und wenn man eine wählt,

    kann man eignetlich beliebigen Namen nehmen, wie bei jeder anderer Datei....

    Komisch...aber danke :)

    Sonntag, 5. September 2010 15:34
  • Hallo,

    man kann natürlich noch mehr mit der Konfiguration anstellen,
    siehe z. B. das Beispiel zu ConfigurationManager.OpenMappedExeConfiguration
    dazu sollte es aber einen begründeten Anlass geben
    und man die Möglichkeiten verstanden und ausgeschöpft haben.

    In der Voreinstellung wird das beschriebene Verfahren angewendet,
    und die verwendete Konfigurationsdatei kannst Du z. B. ermitteln mit:

    	var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
    	Console.WriteLine("Configuration FilePath: {0}", config.FilePath);
    
    
    Gruß Elmar

    Sonntag, 5. September 2010 16:02