Avatar billede _basil Nybegynder
19. oktober 2003 - 21:46 Der er 23 kommentarer og
1 løsning

Webservice i traditionel model/view/controller implementering

Hej..

Jeg har lavet et lille program med en Model/view/controller implementering.. Model delen skriver indholdet af et array til en fil.. og jeg har en datahandler klasser der fungerer som den controller  som GUI bruger til at kontakte model-delen

Nu vil jeg lave en webservice der skal kunne læse indholdet af denne fil.. så jeg har lavet en webservice der opretter et dataHandler objekt, og kalder dens toString metode.. Jeg har tjekket i GUI at denne retunerer den rigtige string, men når jeg kalder denne funktion på webservicen retunerer den bare en tom string?
Avatar billede finger Nybegynder
19. oktober 2003 - 21:53 #1
det lyder som om lidt eksempel kode kunne være en god ide...
Avatar billede _basil Nybegynder
19. oktober 2003 - 21:58 #2
webservice:
public class Service1 : System.Web.Services.WebService
    {
        private dataHandler dt = new dataHandler();
               
        public Service1()
        {
           
            InitializeComponent();
           
        }

        #region Component Designer generated code
       
       
        private IContainer components = null;
               
                private void InitializeComponent()
        {

        }

        protected override void Dispose( bool disposing )
        {
            if(disposing && components != null)
            {
                components.Dispose();
            }
            base.Dispose(disposing);       
        }
       
                #endregion


        [WebMethod]
        public string HentBeholdning()
        {
            return dt.toString();
            //return "ÆØÅ Dette er en test";
        }
        }
}

dataHandler:
{
    public class dataHandler
    {
        private Beholdning beh;
       
        public dataHandler()
        {
            beh = new Beholdning();
            beh.hentFil();
            beh.trim();
        }

        public void trim()
        {
            beh.trim();
        }

        public void tilføjIngrediens(Ingrediens ing)
        {
            beh.tilføjTilBeholdning(ing);
        }
   
        public int getSize()   
        {
            return beh.getSize();
        }

        public Ingrediens hentIngrediens(int i)   
        {
            Ingrediens ing = (Ingrediens) beh.hentIngrediens(i);
            return ing;
        }

        public void gemData(){
            beh.gemFil();
        }

        public void hentData(){
            beh.hentFil();
        }

        public void sletIngrediens(int i){
            beh.sletIngrediens(i);
            beh.trim();
        }

        public void sletIngrediens(string str)
        {
            beh.sletIngrediens(str);
            beh.trim();
        }

        public ArrayList hentBeholdning(){
            return beh.getBeholdning();
        }

        public string toString(){
            return beh.toString();
//            return "Datahandler OK";
        }

    }
}
Avatar billede _basil Nybegynder
19. oktober 2003 - 22:14 #3
Som du kan se har jeg udkommenteret en linje i toString metoden. hvis jeg bruger den udkommenterede return statement retunere webservicen godt nok "Datahandler OK"... bruger jeg beh.tosString() retunere webservicen ingenting men mit GUI retunere den rigtigt string.. Fatter det ikke :)
Avatar billede finger Nybegynder
19. oktober 2003 - 23:19 #4
det ser ud til at koden du har her ikke fejler noget. Er du sikker på at der ligger noget i din beholdningsklasse når du kalder HentBeholdning()? (WS er jo stateless som default)

Fejlen kunne også ligge i din beholdningsklasse i sig selv.
Avatar billede _basil Nybegynder
19. oktober 2003 - 23:24 #5
Altså programmet kører uden problemer når jeg kører det gennem min GUI klasse.. webservicen er bare tænkt som en plug-in.. j jeg er ikke med på hvad du mener med at WS er stateless?
Avatar billede finger Nybegynder
20. oktober 2003 - 10:02 #6
Stateless betyder at den ikke gemmer state på objekter mellem 2 webservice kald. Dette skal du selv sørge for at gøre ved brug af fx Session.
Dvs at hvis du bruger eet kald til at fylde noget i din beholdningsklasse (og ikke gemmer i session) og du så bruger et andet kald til at hente data fra din beholdningsklasse, så er det 2 forskellige instanser af beholdningsklassen og dermed er den også tom (hvorfor du får en tom string tilbage).

Men nu kan jeg jo ikke se hvad din beholdningsklasse laver, så det er kun et skud på hvad det kan være...
Avatar billede _basil Nybegynder
20. oktober 2003 - 16:39 #7
Beholdningklasse:
using System;
using System.Collections;
using Model;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace Model
{
    /// <summary>
    /// Denne klasse indeholder alle Ingrediens objekter
    /// </summary>
    ///

    public class Beholdning{
       
        private ArrayList beh;
        public Beholdning(){
            beh = new ArrayList();
        }

        public void tilføjTilBeholdning(Ingrediens i){
            beh.Add(i);
        }

        public Ingrediens hentFørsteIng(){
            Ingrediens ing =  (Ingrediens) beh[0];
            return ing;
        }

        public Ingrediens hentIngrediens(int i){
            beh.TrimToSize();
            Ingrediens ing = (Ingrediens) beh[i];
            return ing;
        }

        public void sletIngrediens(int i){
            beh.RemoveAt(i);
            beh.TrimToSize();
        }

        public void sletIngrediens(string plut)
        {
            Ingrediens it = new Ingrediens();
            foreach(Ingrediens i in beh)
            {
                if(plut == i.toString())
                {
                    it = i;
                }
            }
            sletIngrediens(it);
        }

        public void sletIngrediens(Ingrediens ig)
        {
            beh.Remove(ig);
        }

        public int getSize(){
            return beh.Capacity;
        }

        private void Serialize()
        {
            Stream stream = File.Open("outfile.dat", FileMode.OpenOrCreate);
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(stream, beh);
            stream.Close();
        }

        private void Deserialize()
        {
            try
            {
                FileInfo fi = new FileInfo("outfile.dat");
                beh.TrimToSize();
                Stream stream = File.Open("outfile.dat", FileMode.Open);
                BinaryFormatter bf = new BinaryFormatter();
                beh = (ArrayList) bf.Deserialize(stream);
                stream.Close();
            }
            catch(Exception et)
            {
                et.StackTrace.ToString();
            }
        }

        public void gemFil(){
            Serialize();
        }

        public void hentFil(){
            Deserialize();
        }
       
        public ArrayList getBeholdning(){
            return beh;       
        }

        public void trim(){
            beh.TrimToSize();
        }

        public string toString()
        {
        string str = "";   
        foreach(Ingrediens i in beh){
            str = str + i.toString() + " ";   
//            str = i.toString();
            }
            return str;
//            return "Beholdning OK";
        }
    }
}
Avatar billede arne_v Ekspert
20. oktober 2003 - 16:44 #8
Du laver en ny dataHandler og en ny Beholdning hver gang du instantierer
en Service1.

Hvordan kommer der noget ind i beholdning ?
Avatar billede _basil Nybegynder
20. oktober 2003 - 16:49 #9
Hver gang jeg laver en instans af datahandler laver den jo en instans af Beholdning og kører hentFil.. Den åbner en fil og henter indholdet: Men måske er det denne fil den ikke kan finde? skal den ligge sammen med Service1?
Avatar billede arne_v Ekspert
20. oktober 2003 - 16:56 #10
Kan du ikke lige teste hypotesen ved at angive fuld absolut sti til filen og se om
det så virker ?

ja => OK så ved du hvor problemet ligger

nej => så skal vi lede videre
Avatar billede arne_v Ekspert
20. oktober 2003 - 16:57 #11
Kommer ikke problemet ved, men er det ikke en ineffektiv måde at gøre det
på at læse hele filen hver gang ?
Avatar billede _basil Nybegynder
20. oktober 2003 - 17:05 #12
Jeg har lige prøvet at skrive den absolutte sti.. men stadig uden held.. Jo det er jo faktisk ikke særlig effektivt.. Man burde vel bare gemme hver gang systemet lukker?? Jeg kan evt maile hele min solution til dig.. Jeg er ny i feltet, og dette er mit første spæde forsøg på et program og jeg sidder lidt fast :)
Avatar billede arne_v Ekspert
20. oktober 2003 - 17:13 #13
Mystisk.

Hvis der er et "normalt" 90%-10% mellem read & write kunne du forbedre
performance ved at have den permanent i memory men alligevel skriv den til disk
ved hver update.

Jeg har ikke erfaring med Web Service si .NET, så jeg er nok ikke den rette person
at pusse på opgaven.
Avatar billede _basil Nybegynder
20. oktober 2003 - 17:19 #14
Jeg siger tak for hjælpen anyways.. :)
Avatar billede finger Nybegynder
21. oktober 2003 - 08:22 #15
Så vidt jeg kan se så kalder du da aldrig hentFil() i din constructor.
Så kommer der jo ikke noget data i dit object.
Avatar billede finger Nybegynder
21. oktober 2003 - 08:30 #16
ah jo. nu fandt jeg det :)

hvis DeSerialize ikke kunne finde filen, så ville den kaste en exception, Så det kan ikke være problemet.
Jeg har et opar ideer til noget du kan prøve:

Prøv at sætte et breakpoint i din kode når du henter filen og se om der rent faktisk er noget i array'et.

prøv at ændre denne:

[WebMethod]
        public string HentBeholdning()
        {
            dt = new dataHandler();
            return dt.toString();
            //return "ÆØÅ Dette er en test";
        }
Avatar billede _basil Nybegynder
21. oktober 2003 - 11:19 #17
Hmm har også prøvet ovenstående.. Stadig ingen held.. Jeg tænkte om du (finger) måske var interesseret i at se hele min solution, jeg er villig til at sætte flere point på højkant :)
Avatar billede finger Nybegynder
21. oktober 2003 - 12:06 #18
det kan vi da sagtens finde ud af.
Avatar billede _basil Nybegynder
21. oktober 2003 - 12:11 #19
kanon.. min solution ligger på min notebook, så jeg kan maile det når jeg kommer hjem?? Min mailadresse er thomasbonielsen@hotmail.com.. kan evt kontaktes på messenger?
Avatar billede finger Nybegynder
21. oktober 2003 - 12:35 #20
jeps
Avatar billede thomaslp Nybegynder
21. oktober 2003 - 15:40 #21
Er ikke nogen haj til webservices, men prøv lige at initialisere din dt = new DataHandler() i constructoren på din webservice.
Avatar billede _basil Nybegynder
21. oktober 2003 - 17:33 #22
Thomaslp <-- har jeg også prøvet.. stadig ingen held.. finger jeg fik dig aldrig addet til min messenger så nu har jeg ikke din mail-adresse :) kan du kontakte mig på messenger igen?
Avatar billede finger Nybegynder
22. oktober 2003 - 09:16 #23
og et svar for at kigge på det.
Avatar billede _basil Nybegynder
22. oktober 2003 - 09:18 #24
Måske skal vi lige nævne at det var fordi der manglede en FileAcces.Read Stream stream = File.Open("outfile.dat", FileMode.Open);
Takker for hjælpen
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