Avatar billede marvinq Nybegynder
16. juli 2010 - 11:51 Der er 12 kommentarer og
2 løsninger

Opret webservice med variable parametre

Hej eksperter,

Jeg håber I forstår mit problem.

Jeg har udviklet en C# applikation, som i virkeligheden er et ClassLibrary. Heri ligger kald til en webservice. Denne webservice har en property der hedder web reference, med følgende værdi:

"http://[servernavn]:[portnr]/[sti]/Services"

Alt i klammerne ([...]) skal være variabelt, men hvordan gør man lige det?? Problemet er at servernavn og stien har et navn på min comp, men når jeg distribuerer dette classlibrary til andre, så hedder servernavn og sti noget andet.

Jeg tænkte om det kunne lade sig gøre, at jeg compilerede det hele hos mig, og at de 3 variable-værdier så blev hentet fra en fil, hvori man kan rette disse værdier til lokalt hos de enkelte brugere... Men hvordan kan det lade sig gøre?? Og kan det lade sig gøre??

Eller er der andre måder at få det til at fungere på. Jeg kan ikke compilere filerne til deres servernavn, da det naturligvis ikke er tilgængelig hos mig.

På forhånd mange tak!!
Avatar billede heinzdmx Nybegynder
16. juli 2010 - 12:37 #1
Hvis du vil have indstillingsfil så vil jeg anbefale xml, det er godt integreret med .net og er rimelig nemt.

Jeg plejer at gøre det sådan her:
Lav 2 metoder, en read og en write, hvor write kræver de 3 indstillinger sent som parametre.
Har ikke lige adgang til min kode, men det er noget med, xmlTextWriter, og xmlTextWriter, under System.xml
Avatar billede marvinq Nybegynder
16. juli 2010 - 12:42 #2
Okay, jamen dvs. det kan godt lade sig gøre, og det kræver ikke at webservicen compileres igen?

Jeg er nok nødt til at skal have et eksempel. Du har ikke noget eller måske et link til det??

Takker
Avatar billede jimpp Nybegynder
16. juli 2010 - 12:46 #3
Du kan tilføje webservicen som en Web Reference - eller det ahr du vel gjort :)

Web Referancen har en property der hedder "URL Behavior" - den sætter du til Dynamic - derefter er det bare:

WebService MyService = new WebService();
MyService.Url = "Dynamisk url";

Er det, det du leder efter? Hvordan filerne læses ind, det er lidt op til dig selv, men Xml er nok klart det nemmeste :)
Avatar billede marvinq Nybegynder
16. juli 2010 - 12:56 #4
Hej tak for input.

Har I link til indlæsning af xml eller kort forklaring. Har jeg aldrig prøvet før i c#
Avatar billede heinzdmx Nybegynder
16. juli 2010 - 13:11 #5
Du skal lave en ny compile, hvor du i stedet for at kigge på det kun til din egen så i stedet at læse xml filen.

Jeg kan skrive min egen kode senere, men det er  ikke svært at finde eksempler på Google.
Avatar billede heinzdmx Nybegynder
16. juli 2010 - 13:20 #6
Tror faktisk IKKE det kræver compile af servicen... nok mig der var lidt før hurtig... bare du andre dit class lib
Avatar billede marvinq Nybegynder
16. juli 2010 - 13:23 #7
Ja, det er da ikke så svært :)

Tak for hjælpen.

Smid svar begge to.
Avatar billede heinzdmx Nybegynder
16. juli 2010 - 13:51 #8
Svar her
Avatar billede jimpp Nybegynder
16. juli 2010 - 16:23 #9
Hep :)
Avatar billede heinzdmx Nybegynder
16. juli 2010 - 17:14 #10
metoden jeg så sørger for at lave reader metoden er at man laver et enum, som der så skal kaldes på som argument til read metoden, så skal du ikke huske på hvad den rigtige parameter var.

Samlet kodesnippet

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Windows.Forms;

namespace Syanicer
{
    /// <summary>
    /// Be sure first to set the SettingsFile path before doing anything
    /// </summary>
    public class XML
    {
        public XML(string settingsfile)
        {
            m_SettingsFile = settingsfile;
        }

        private string m_SettingsFile = "";

        public enum Setting
        {
            servernavn, portnr, sti
        }

        /// <summary>
        /// This will save the settings in the xml file
        /// </summary>
        /// <param name="servernavn">"Servernavn"</param>
        /// <param name="portnr">"Portnr"</param>
        /// <param name="sti">"Sti"</param>
        public void SaveSettings(string servernavn, string portnr, string sti)
        {
            if (m_SettingsFile == "")
            {
                MessageBox.Show("Fault in XML.dll, setttingsfile not set \n program halted", "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw new Exception("Settingsfile not set");
            }

            try
            {
                // writing to settingsfile
                using (XmlTextWriter textWriter = new XmlTextWriter(m_SettingsFile, Encoding.ASCII))
                {
                    // Starts the document
                    textWriter.WriteStartDocument();

                    // Write comments
                    string comment = "\nThis is the settings file for Syanicer\n";
                    textWriter.WriteComment(comment);

                    textWriter.WriteStartElement("Settings");

                    // new line in comment
                    textWriter.WriteComment("\n");

                    {
                        // Write element
                        textWriter.WriteStartElement("servernavn");
                        textWritWriteString(servernavn);
                        textWriter.WriteEndElement();

                        // new line in comment
                        textWriter.WriteComment("\n");er.

                        // Write element
                        textWriter.WriteStartElement("portnr");
                        textWritWriteString(portnr);
                        textWriter.WriteEndElement();

                        // new line in comment
                        textWriter.WriteComment("\n");er.

                        // Write element
                        textWriter.WriteStartElement("sti");
                        textWritWriteString(sti);
                        textWriter.WriteEndElement();

                        // new line in comment
                        textWriter.WriteComment("\n");er.
                    }

                    // Ends the settings element
                    textWriter.WriteEndElement();

                    // Ends the document.
                    textWriter.WriteEndDocument();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error:\n" + e, "Syanicer", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// Read the settings in settingsfile
        /// </summary>
        /// <param name="setting">The setting to read</param>
        /// <returns>Returns the setting defined in setting</returns>
        public string ReadSetting(Setting setting)
        {
            string Name = setting.ToString();

            if (m_SettingsFile == "")
            {
                MessageBox.Show("Fault in XML.dll, setttingsfile not set \n program halted", "Lancelot", MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw new Exception("Settingsfile not set");
            }

            if (!File.Exists(m_SettingsFile))
                return "";

            string settingsValue = "";

            try
            {
                // Create an instance of XmlTextReader and call Read method to read the file
                using (XmlTextReader textReader = new XmlTextReader(m_SettingsFile))
                {
                    while (textReader.Read())
                    {
                        // Move to next element
                        textReader.MoveToElement();

                        if (textReader.Name == Convert.ToString(Name))
                            settingsValue = textReader.ReadString();
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error:\n" + e, "Exception occured", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return settingsValue;
        }
    }
}



Jeg har tilpasset metoden til at indeholde de 3 variabler du skal bruge. Jeg har lagt det i en anden namespace, sådan at den kan tilføjes som en dll, det kan du selvfølgelig ændre. Lige nu kræver den at blive tilføjet sådan her:

Xml xml = new Xml("STIEN TIL SETTINGSFILE");

og derefter kalde xml.ReadSettings(Setting portnr)
og xml.SaveSettings("servernavn", "portnr", "sti")
Avatar billede Pulchra Nybegynder
17. juli 2010 - 01:01 #11
Hej marvinq,

Hvorfor ikke bruge en af de indbyggede måde at håndtere indstillinger i .net.

Her er et komplet kode eksempel:
Der er to dele, en ServiceLibrary assembly og så en simpel konsol applikation, som bruger service librariet.

ServiceLibrary
- MyService.cs
- Configuration.cs

Konsol
- Program.cs
- App.config


//Her ServiceLibrary koden

using System.Configuration;

namespace ServiceLibrary
{
    public class MyService
    {
        public string Server { get; private set; }
        public int Port { get; private set; }
        public string Path { get; private set; }

        public MyService()
        {
            Server = Configuration.GetConfiguration().Server;
            Port = Configuration.GetConfiguration().Port;
            Path = Configuration.GetConfiguration().Path;
        }
    }
}

//Her er selve custom konfigurations koden

using System.Configuration;

namespace ServiceLibrary
{
    public class Configuration : ConfigurationSection
    {
        public static Configuration GetConfiguration()
        {
            Configuration configuration =
                ConfigurationManager
                .GetSection("MyServiceSettings")
                as Configuration;

            if (configuration != null)
                return configuration;
            else
            {
                //Here you could throw an exception explaining how the user should include the configuration needed to use this service.
            }

            return new Configuration();
        }

        [ConfigurationProperty("server", IsRequired = true)]
        public string Server
        {
            get
            {
                return this["server"] as string;
            }
        }

        [ConfigurationProperty("port", IsRequired = true)]
        public int Port
        {
            get
            {
                return (int)this["port"];
            }
        }

        [ConfigurationProperty("path", IsRequired = true)]
        public string Path
        {
            get
            {
                return this["path"] as string;
            }
        }
    }
}


//Her kommer så programmet som skal bruge servicen

namespace Console1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyService service = new MyService();
            Console.WriteLine(string.Format("http://{0}:{1}/{2}/Services",
                service.Server, service.Port, service.Path));

            Console.ReadKey();
        }
    }
}


//Og her her selve konfig filen.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="MyServiceSettings" type="ServiceLibrary.Configuration, ServiceLibrary"/>
  </configSections>
  <MyServiceSettings server="server1" port="8888" path="MyService"  />
</configuration>


Om der er brug for mere forklaring til de enkelte dele, skal du endelig spørge.

/Hallur
Avatar billede arne_v Ekspert
19. juli 2010 - 04:28 #12
Man bør absolut bruge standard app.config fremfor at genopfinde sin egen konfigurations fil.

Til dette her brug vil jeg endda finde det helt tilstrækkeligt med app settings fremfor en custom section.
Avatar billede Pulchra Nybegynder
19. juli 2010 - 14:14 #13
Der vil jeg sige at jeg ikke er enig.
App settings sektionen skal kun bruges til simple site/applikations specifikke indstillinger. Når man udvikler et 3. parts library, vil jeg sige at man altid skal sørge for at de tilhørende indstillinger får sin egen custom sektion. Det er der flere grunde til bl.a. at appsettings lever i et globalt scope, som gør at der en reel mulighed for at der kan opstå navnekonflikter. Så er der også for overblikkets og læsbarhedens skyld.

Jeg har set adskillige applikationer, hvori der har været flere 100 entries i app settings sektionen, som gør at man mister totalt overblikket, og man bliver nød til at grave rundt i koden for at finde ud af hvad de forskellige settings bliver brugt til og hvordan de hører sammen.

/Hallur
Avatar billede arne_v Ekspert
22. juli 2010 - 04:24 #14
Med app settings kan man bare have en entry:

<add key="whatever.webservice.url" value="http://www.whatever.dk:81/whatever/Service"/>


og hente med:

ConfigurationManager.AppSettings["whatever.webservice.url"]

Det er ikke sofistikeret, men det sparer en masse kode.

Der kan være gode grunde til at man vil opdele tingene bedre, men medmindre man har et specifikt behov, så bør man gå efter den simple løsning.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester