Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] XML ipadres vervangen app.config

Pagina: 1
Acties:
  • 400 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo,

Ik ben bezig een client server appicatie te schrijven in C# onder Visual studio .NET.

Hierbij heb ik bij de client een app.config file waarin staat welk ip adres ik wil gebruiken voor de server. Ik gebruik nu de localhost omdat ik nog op 1 systeem werk. Nu wil ik dus via een invoer veldje het ipadres bepalen (ingevoerd door gebruiker) en ik wil de app.config (xml format) aanpassen.

Ik krijg dit onder VB.NET prima voor elkaar alleen het lukt met niet bij c#.

Ik weet niet wat ik verkeerd doe.
Ik heb al heel wat afgezocht maar kan niet echt iets nuttigs vinden. (Misschien zoek ik wel verkeerd)

Dit is de code die ik gebruik:

public void SetIP(string IP)
ServerIP = IP+":1234/AdminForm/Eiland";
XmlDocument xmlIP = new XmlDocument();
xmlIP.Load("ControllerForm.exe.config");
XmlNode xnoNode = xmlIP.SelectSingleNode("//add[key='ControllerURL']");
xnoNode.Attributes.GetNamedItem("value").InnerText=ServerIP;
xmlIP.Save("ControllerForm.exe.config");

}

Ik weet alleen dat zodra ik XnoNode een waarde geef dat het niet goed gaat.

Dit is de xml file:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add
key="ControllerURL"
value="http://localhost:1234/AdminForm/Eiland"
/>
</appSettings>
<system.runtime.remoting>
<application name="ControllerForm">
<channels>
<channel ref="Http" port="0">
<clientProviders>
<formatter ref="binary"/>
</clientProviders>
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>

Heeft iemand de oplossing?

Voor alle duidelijkheid :

Deze regel: http://localhost:1234/AdminForm/Eiland
Moet veranderen in het opgegeven ipadres.

Mvg Perry

[ Voor 42% gewijzigd door Verwijderd op 13-11-2004 17:34 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:30
Als je de code in vb.Net werkend hebt, dan is het toch een eitje om ze in C# om te zetten?

Wat gaat er dan fout? Krijg je een exceptie , werkt het gewoon niet, etc...

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik dacht ook dat het een eitje was. Als ik ga kijken in tijdens het debuggen zie ik dat XnoNode <unassiged value> krijgt. Die krijgt dus geen waarde of null.

Wat ik verkeerd doe weet ik dus niet.
Hoogstwaarschijnlijk een syntax fout.
Maar welke is de vraag.

[ Voor 6% gewijzigd door Verwijderd op 13-11-2004 16:11 ]


Verwijderd

Hmmz even zien ms bied geen standaard functionaliteit aan om in de applicatie config te schrijven, maar wel om te lezen...

zou het kunnen zijn dat het helemaal niet de bedoeling is dat je via code in die file schrijft? nah... vast niet.. ze zijn vast gewoon lui en hebben die class vergeten mee te leveren.

mgoed aangezien je het nu toch doet hou er rekening mee dat de appsettings maar eenmalig gelezen worden dus ook na het aanroepen van je SetIP functie zal het uitvragen nog gewoon de oude waarde geven...

just my 2 €-cents...

Verwijderd

Topicstarter
ServerIP = IP+":1234/AdminForm/Eiland";
XmlDocument xmlIP = new XmlDocument();
xmlIP.Load("ControllerForm.exe.config");
XmlNode xnoNode = xmlIP.SelectSingleNode("//add[key='ControllerURL']");
xnoNode.Attributes.GetNamedItem("value").InnerText=ServerIP;
xmlIP.Save("ControllerForm.exe.config");

De oude Ip was localhost en de nieuwe ip is een ip adres.

Dit is de code die volgens kenners gebruikt moeten worden.

Nog bestaat het probleem nog steeds dat na deze aanroep:
XmlNode xnoNode = xmlIP.SelectSingleNode("//add[key='ControllerURL']");

xnoNode nog steeds null is

:?

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:30
Verwijderd schreef op zaterdag 13 november 2004 @ 16:40:
Hmmz even zien ms bied geen standaard functionaliteit aan om in de applicatie config te schrijven, maar wel om te lezen...

zou het kunnen zijn dat het helemaal niet de bedoeling is dat je via code in die file schrijft? nah... vast niet.. ze zijn vast gewoon lui en hebben die class vergeten mee te leveren.
Ik dacht eigenlijk ook dat het niet de bedoeling was dat je die config-files zou kunnen wijzigen; aan de andere kant: het is gewoon een xml document, dus theoretisch is het wel mogelijk...
mgoed aangezien je het nu toch doet hou er rekening mee dat de appsettings maar eenmalig gelezen worden dus ook na het aanroepen van je SetIP functie zal het uitvragen nog gewoon de oude waarde geven...
Voor WinForms app's is dit idd het geval.... Voor de web.config in asp.net niet, magoe, dit gaat toch over winforms.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:30
Verwijderd schreef op zaterdag 13 november 2004 @ 17:31:
Nog bestaat het probleem nog steeds dat na deze aanroep:
XmlNode xnoNode = xmlIP.SelectSingleNode("//add[key='ControllerURL']");

xnoNode nog steeds null is

:?
Er zal dus een probleem zijn met het argument. SelectSingleNode returned ws null als hij geen node vind die voldoet aan de opgegeven argumenten.

offtopic:
Fuck, m'n .NET documentatie is blijkbaar naar de zak. :(

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik lees die file idd maar een keer uit. Dit doe ik nadat ik de file heb gewijzigd dus dit is niet mijn probleem.

Verwijderd

Topicstarter
whoami schreef op zaterdag 13 november 2004 @ 18:04:
[...]


Er zal dus een probleem zijn met het argument. SelectSingleNode returned ws null als hij geen node vind die voldoet aan de opgegeven argumenten.

offtopic:
Fuck, m'n .NET documentatie is blijkbaar naar de zak. :(
Exact alleen wat is dan de fout?

:?

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:30
Key is een attribute van dat xml element, dus ik denk dat je xpath query er zo moet uit zien:
code:
1
//add[@key='ControllerURL']


Mind the @ us

https://fgheysels.github.io/


Verwijderd

Topicstarter
Helaas dat mocht ook niet baten ;(

Weet iemand hoe ik met verwijzingen in xmlfiles kan werken?
Het is dus wel mogelijk om een eigen file creeren met een ip adres erin en zeggen in de xml file dat hij het ipadres kan vinden in die file.

Ik heb er alleen geen ervaring mee.

[ Voor 83% gewijzigd door Verwijderd op 13-11-2004 18:16 ]


Verwijderd

das omdat je 'n lousy cut'n'paste job hebt gedaan en de @ voor key vergeten bent natuurlijk.

[edit]
Ik haat het als Whoami me net weer voor is.

[ Voor 30% gewijzigd door Verwijderd op 13-11-2004 18:19 ]


Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 13 november 2004 @ 18:18:
das omdat je 'n lousy cut'n'paste job hebt gedaan en de @ voor key vergeten bent natuurlijk.

[edit]
Ik haat het als Whoami me net weer voor is.
|:(

Verwijderd

je kan wel |:( doen maar 't is toch echt de oplossing

code:
1
2
3
4
5
6
7
8
9
10
11
    static void Main(string[] args)
        {
            
            string ServerIP = "localdork:1234/AdminForm/Eiland";
            XmlDocument xmlIP = new XmlDocument();
            xmlIP.Load("c:\\dork.xml"); 
            XmlNode xnoNode = xmlIP.SelectSingleNode("//add[@key='ControllerURL']");
            xnoNode.Attributes.GetNamedItem("value").InnerText=ServerIP;
            xmlIP.Save("c:\\dork.xml");

        }

works like a charm

Verwijderd

Topicstarter
Verwijderd schreef op zaterdag 13 november 2004 @ 18:22:
je kan wel |:( doen maar 't is toch echt de oplossing

code:
1
2
3
4
5
6
7
8
9
10
11
    static void Main(string[] args)
        {
            
            string ServerIP = "localdork:1234/AdminForm/Eiland";
            XmlDocument xmlIP = new XmlDocument();
            xmlIP.Load("c:\\dork.xml"); 
            XmlNode xnoNode = xmlIP.SelectSingleNode("//add[@key='ControllerURL']");
            xnoNode.Attributes.GetNamedItem("value").InnerText=ServerIP;
            xmlIP.Save("c:\\dork.xml");

        }

works like a charm
En dat is nou net wat niet werkt..... dubbel |:(

Maar goed om even terug te komen op een eerder gestelde vraag:
Verwijderd schreef op zaterdag 13 november 2004 @ 18:13:
Helaas dat mocht ook niet baten ;(

Weet iemand hoe ik met verwijzingen in xmlfiles kan werken?
Het is dus wel mogelijk om een eigen file te creeren met een ip adres erin en zeggen in de xml file dat hij het ipadres kan vinden in die file.

Ik heb er alleen geen ervaring mee.
Iemand hier meer over?

[ Voor 56% gewijzigd door Verwijderd op 13-11-2004 19:41 ]


Verwijderd

Topicstarter
Is er misschien een andere manier om het ip adres te veranderen als er gebruik wordt gemaakt van bovenstaande techniek.??

Ik denk wel dat het mogelijk is om het ipadres te veranderen zonder dat ik kei hard die xml-file aan hoef te passen..

Maar hoe?

Iemand suggesties?

Verwijderd

Topicstarter
Voor elkaar.

Bedankt allemaal voor de ondersteuning!

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:30
Ja lekkere instelling heb jij zeg.

Mensen proberen je te helpen, en het enige wat jij kunt doen is een |:( posten. :/

En het dan ook nog eens vertikken om de oplossing zelf te vermelden.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op zondag 14 november 2004 @ 10:46:
Ja lekkere instelling heb jij zeg.

Mensen proberen je te helpen, en het enige wat jij kunt doen is een |:( posten. :/

En het dan ook nog eens vertikken om de oplossing zelf te vermelden.
Mijn excuses

Ik heb de bovenstaande code gebruikt die helemaal bovenin staat.
Ik weet niet wat ik verkeerd gedaan heb maar er zat iets verkeerd? :?
Waarschijnlijk iets zeer lulligs in andere code op in de app.config file.
Ik weet het niet en ik ben er ook nog steeds niet achter.

de @ moet iig wel gebruikt worden.

Sorry van de |:( je tips zijn er bruikbaar geweest alleen ik moest even mijn frustratie kwijt. Een hele dag voor zoiets pietluttigs en dan uiteindelijk de juiste code onder mijn neus te hebben staan..

Ik weet nog steeds niet waar het aan lag.

Ik ben er wel achtergekomen dat je dit eigenlijk niet een met XML zou hoeven te doen als ze bij microslet niet zo slordig waren.

ip = ConfigurationSettings.AppSettings.GetValues("ControllerURL")[0].ToString();
dit is het opvragen

nu heeft deze ook een set functie
ConfigurationSettings.AppSettings.Set(enz enz

Dit werkt niet omdat de class read only is.

Dus uiteindelijk MOET het dus met XML

De uiteindelijke code is:
Met dank aan bovenstaande posters:

public void SetIP(string IP)
{
ServerIP = "http://"+IP+":1234/AdminForm/Eiland";
XmlDocument xmlIP = new XmlDocument();
xmlIP.Load("ControllerForm.exe.config");
XmlNode xnoNode = xmlIP.SelectSingleNode("//add[@key='ControllerURL']");
xnoNode.Attributes.GetNamedItem("value").InnerText=ServerIP;
xmlIP.Save("ControllerForm.exe.config");
}

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:30
Verwijderd schreef op zondag 14 november 2004 @ 23:16:
[...]

Ik ben er wel achtergekomen dat je dit eigenlijk niet een met XML zou hoeven te doen als ze bij microslet niet zo slordig waren.
:?
Waar zijn ze dan slordig geweest?
Hoe zou je het dan wel moeten doen volgens jou?
Niemand verplicht je om die app.config te gebruiken, en er is ook niemand die je ervan weerhoud om een andere manier te gebruiken/bedenken.
nu heeft deze ook een set functie
ConfigurationSettings.AppSettings.Set(enz enz

Dit werkt niet omdat de class read only is.
Tja, het is natuurlijk wel de bedoeling dat die appsettings read-only is. Dat is geen kwestie van slordigheid; het zou pas slordig zijn als een applicatie z'n config-file zou kunnen aanpassen.
Stel je voor dat een web-applicatie op een of andere manier in staat zou zijn om de web.config aan te passen....

https://fgheysels.github.io/


Verwijderd

Topicstarter
Het is natuurlijk wel zo dat er een Set functie inzit. Die suggereerd dat er wat te setten valt. Helaas werkt deze funtie niet omdat het read only is. Dus ja niet erg handig. Het is natuurlijk wel veiliger maar hij zal toch aangepast moeten worden om ons doel te verwezenlijken. Het gaat hier ook niet om een web applicatie.

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:30
Die Set method zit er idd in omdat dit een member-method is van de 'NameValueCollection' class.
De AppSettings property is een instance van de NameValueCollection class, dus is het best logisch dat die een Set method heeft.
Echter, AppSettings is een property van ConfigurationSettings, en de AppSettings property is read-only, omdat men van MS beslist heeft dat je de confugratie-instellingen niet mag wijzigen. Dat die Set method eris, daar kan je dus niet van onderuit.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 06-10 13:51

pjvandesande

GC.Collect(head);

Je kan toch gewoon zelf een AppSetting class maken met wel een set -method? :?

Verwijderd

Zoals ik vorige week al zei ms WIL niet dat je schrijft vanuit je app aan die file rommelt heeft niets met slordigheid te maken meer met koppigheid van de developer dat ie het toch moet en zal doen.

Is het niet gewoon veel makkelijker /flexibeler een class te maken met alle settings binnen je applicatie en die te serialiseren naar disk? kan je nog rijkere datastructuren gebruiken ook dan simpele key/value pairs met minder code dan die je nu besteeds aan het dwangmatig/koppig schrijven in die app.config "because all the cool kids do it.."

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 06-10 13:51

pjvandesande

GC.Collect(head);

Misschien moet je dit even lezen.

  • Equator
  • Registratie: April 2001
  • Laatst online: 19-11 14:24

Equator

Crew Council

#whisky #barista

Verwijderd schreef op maandag 22 november 2004 @ 20:02:
Zoals ik vorige week al zei ms WIL niet dat je schrijft vanuit je app aan die file rommelt heeft niets met slordigheid te maken meer met koppigheid van de developer dat ie het toch moet en zal doen.

Is het niet gewoon veel makkelijker /flexibeler een class te maken met alle settings binnen je applicatie en die te serialiseren naar disk? kan je nog rijkere datastructuren gebruiken ook dan simpele key/value pairs met minder code dan die je nu besteeds aan het dwangmatig/koppig schrijven in die app.config "because all the cool kids do it.."
Complete n00b modus: Ik weet niet wat serialiseren is (ga ik uitzoeken) maar je kan toch met XmlTextWriter en XmlTextReader zelf een XML file uitlezen, en aanpassen.
Daarin kan je dan je eigen setting's kwijt.
Ik probeer iets dergelijks nu ook te maken (ik heb er wel moeite mee..maar dat komt wel goed)
Overigens zijn zowel XmlTextreader als XmlTextWriter in VS2005 nogal gebruikersvriendelijker geworden.

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:30
Nog even waarom je niet naar je app.config moet schrijven:

http://www.interact-sw.co...g/2004/11/25/savingconfig

:)

https://fgheysels.github.io/

Pagina: 1