Avatar billede extremecode Nybegynder
23. september 2004 - 20:59 Der er 40 kommentarer og
1 løsning

Webservice og objecter

Har et problem..

Jeg forsøger at sende et object fra webservice til en client.

Et hurtigt eksemple...tag jer ikke af navnene

sing System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

namespace mandetester
{
[WebService(Namespace="http://localhost/WebService/WebService.asmx")]
    public class WebService : System.Web.Services.WebService
    {
        public WebService()
        {
            InitializeComponent();
        }

        #region Component Designer generated code
       
        //Required by the Web Services Designer
        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 mand getMand()
        {
                Mand mand= new Mand("Erik", "Larsen");
                return mand
        }
}

Client
localhost.WebService WS = new localhost.WebService();
Mand mand = WS.getMand();

Og her kommer så min fejl
Jeg kan ikke sætte det object som jeg får fra webservice, med det objectt der ligger på clienten...De skulle gerne være ens da de benytter samme class, som er importeret både i webservice og på client programmet...
begge bruger namespace Mandetester

får følgende fejl
cannot implicity convert type mandetester.localhost.Mand to mandetester.Mand...

Og hvorfor ikke det begge objecter skulle være ens...

nogle svar??
Avatar billede snepnet Nybegynder
23. september 2004 - 21:03 #1
du kan bare lægge Mand som en public class på din webservice, så kan du instantiere den fra en klien-applikation.

ellers bare lav et typecast :
Mand mand = (mandetester.Mand)WS.getMand();
Avatar billede snepnet Nybegynder
23. september 2004 - 21:04 #2
bliver så bare
Mand mand = (Mand)WS.getMand();
Avatar billede snepnet Nybegynder
23. september 2004 - 21:04 #3
(miljøet kan ikke vide at de er ens... det er godt nok samme klassenavn, men det er forskelligt namespace)
Avatar billede arne_v Ekspert
23. september 2004 - 21:08 #4
Øh.

Når du kører WSDL utilityen og genererer stub kode udfra WSDL'en, så bør du
få genereret en Mand klasse i det rette namespace, så hvis du bruger
den i.s.f. så bør det virke uden nogen ændringer.
Avatar billede extremecode Nybegynder
23. september 2004 - 21:13 #5
det med at typecaste har jeg prøvet og det virker ikke det er der jeg får fejlen.
cannot implicity convert type mandetester.localhost.Mand to mandetester.Mand..

men ok hvad hvis jeg har 20 klasser som jeg benytter skal alle metoderne fra klasser gøres public på webservice før man kan benytte dem. er det ikke nok man har en kopi af klassen på klienten som man så derfra kan benytte klassens metoder for at få adgang til indholdet...hvis du/i kan følge min tankegang....syntes bare det virker ulogisk at man smider alt det der står i classen ind i webservice...virker sådan lidt "lad os lave det hele en gang til" :)
Avatar billede extremecode Nybegynder
23. september 2004 - 21:15 #6
har læst om WSDL men aner ikke hvordan man får det til at virke...er det noget du kan komme med et eksempel på arne..
Avatar billede arne_v Ekspert
23. september 2004 - 21:17 #7
Selvfølgelig kan man ikke type caste fra en klasse til en anden fordi det burde
have været samme klasse (det kan computeren ikke se).
Avatar billede snepnet Nybegynder
23. september 2004 - 21:17 #8
implicity typecast tyder nu på at du ikke har foretaget et explicit typecast som f.eks. (Mand)GetMand();

læste du det som arne skrev.... ?

hvilket miljø udvikler du i ?
Avatar billede arne_v Ekspert
23. september 2004 - 21:18 #9
åben en kommando prompt
definet PATH korrekt
wsdl http://localhost/dinwebservice.asmx
og så skulle du have stub inklusive de klasser den bruger
Avatar billede arne_v Ekspert
23. september 2004 - 21:19 #10
meget vigtigt:

udvikl client koden seperat fra server koden så du ikke får dem blandet sammen
Avatar billede extremecode Nybegynder
23. september 2004 - 21:20 #11
C# under visual studio..

og jo har skrevet Mand mand= (Mand)ws.getMand();

øøh ja..mener jo også det er samme klasse...men hvorfor kan den ikke finde ud af at den klasse der ligger på clienten er den samme som det webservice har adgang til...er der noget som man skal gøre som jeg har overset...

Kan i måske komme med et eksemple?? så ville jeg blive glaad
Avatar billede extremecode Nybegynder
23. september 2004 - 21:22 #12
ok med hensyn til wsdl har jeg skrevet som du siger aner men den siger at wsdl is not regocnozed as an internal or external command...

Er wsdl noget man skal installere seperat eller ligger det sammen med visual studio??
Avatar billede arne_v Ekspert
23. september 2004 - 21:25 #13
definet PATH korrekt !!!!
Avatar billede arne_v Ekspert
23. september 2004 - 21:25 #14
Jeg bruger:

PATH=C:\WINNT\MICROS~1.NET\FRAMEW~1\V11~1.432;C:\PROGRA~1\MICROS~1.NET\SDK\v1.1\bin;C:\PROGRA~1\MICROS~2.NET\Vc7\bin;C:\PROGRA~1\MICROS~2.NET\Common7\IDE;%PATH%
Avatar billede arne_v Ekspert
23. september 2004 - 21:26 #15
Jeg kan godt lave et eksempel.

Men det bliver rent command line.

Jeg aner ikke hvordan man gør i Visual Studio.
Avatar billede snepnet Nybegynder
23. september 2004 - 21:28 #16
du tilføjer bare en webreference... så fikser vs resten selv.
Avatar billede snepnet Nybegynder
23. september 2004 - 21:29 #17
men det ser ud til at du allerede har gjort det når du har noget du refererer med localhost.
det er standard navngivning på referencen (altså servernavnet... som så i dit tilfælde er localhost)
Avatar billede extremecode Nybegynder
23. september 2004 - 21:29 #18
ok kan godt være jeg er træt...
men hvad mener du med "definet PATH korrekt"
Avatar billede extremecode Nybegynder
23. september 2004 - 21:30 #19
ok fino...kan godt være jeg bare er dum...men hvorfor dælen virker skidtet så ikke...har lavet client/server ting i java før og der var aldrig probs med at få objecter til at virke...
men det er åbenbart noget andet med webservice
Avatar billede extremecode Nybegynder
23. september 2004 - 21:31 #20
man skal måske ud og benytte remoting i stedet eller??
Avatar billede snepnet Nybegynder
23. september 2004 - 21:31 #21
har du din webservice liggende i et projekt for sig ?
Avatar billede extremecode Nybegynder
23. september 2004 - 21:32 #22
ja webservice og client er i hver sit project
Avatar billede arne_v Ekspert
23. september 2004 - 21:33 #23
Web services kan noget som client server ikke kan, men er lidt mere
komplekse - specielt hvis værktøjerne ikke rigtigt vil som man selv vil
Avatar billede extremecode Nybegynder
23. september 2004 - 21:33 #24
hvor client adder en webreference til webservice
Avatar billede snepnet Nybegynder
23. september 2004 - 21:35 #25
ok... så skal du ikke gøre andet.
din klasse mand, skal så bare defineres i din service.
(du skal ikke selv gøre noget andre steder... vs fikser det ved brug af wsdl.exe)
Avatar billede extremecode Nybegynder
23. september 2004 - 21:36 #26
ok det vil sige at konstroktør og set og get metoder skal ligge i selve webservicen hvis jeg forstår korrekt??
Avatar billede snepnet Nybegynder
23. september 2004 - 21:37 #27
du får lige et lille eksempel ... 5 min
Avatar billede arne_v Ekspert
23. september 2004 - 21:41 #28
web service
-----------

Test.cs i bin dir:

using System;
using System.Web.Services;

namespace test
{
    public class Foobar
    {
        private int iv;
        private string sv;
        public int Iv
        {
            get
            {
                return iv;
            }
            set
            {
                iv = value;
            }
        }
        public string Sv
        {
            get
            {
                return sv;
            }
            set
            {
                sv = value;
            }
        }
    }
    public class Test : WebService
    {
        [WebMethod]
        public Foobar TestIt()
        {
            Foobar res = new Foobar();
            res.Iv = 123;
            res.Sv = "ABC";
            return res;
        }
    }
}

build:

csc /t:library Test.cs

Test.asmx:

<%@ WebService Language="C#" Class="test.Test" %>

client
------

stub gen:

wsdl http://localhost/Test.asmx

genereret Test.cs (bemærk: meget forskellig fra server versionen !):

//------------------------------------------------------------------------------
// <autogenerated>
//    This code was generated by a tool.
//    Runtime Version: 1.1.4322.573
//
//    Changes to this file may cause incorrect behavior and will be lost if
//    the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------

//
// This source code was auto-generated by wsdl, Version=1.1.4322.573.
//
using System.Diagnostics;
using System.Xml.Serialization;
using System;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.Services;


/// <remarks/>
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="TestSoap", Namespace="http://tempuri.org/")]
public class Test : System.Web.Services.Protocols.SoapHttpClientProtocol {
   
    /// <remarks/>
    public Test() {
        this.Url = "http://localhost/Test.asmx";
    }
   
    /// <remarks/>
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/TestIt", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    public Foobar TestIt() {
        object[] results = this.Invoke("TestIt", new object[0]);
        return ((Foobar)(results[0]));
    }
   
    /// <remarks/>
    public System.IAsyncResult BeginTestIt(System.AsyncCallback callback, object asyncState) {
        return this.BeginInvoke("TestIt", new object[0], callback, asyncState);
    }
   
    /// <remarks/>
    public Foobar EndTestIt(System.IAsyncResult asyncResult) {
        object[] results = this.EndInvoke(asyncResult);
        return ((Foobar)(results[0]));
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
public class Foobar {
   
    /// <remarks/>
    public int Iv;
   
    /// <remarks/>
    public string Sv;
}

TestTest.cs test program:

using System;

class TestClass
{
    public static void Main(string[] args)
    {
        Test serv = new Test();
        Foobar tst = serv.TestIt();
        Console.WriteLine(tst.Iv + " " + tst.Sv);
    }
}

build:

csc /out:TestTest.exe TestTest.cs Test.cs

test:

C:\e3>testtest
123 ABC

Keine probleme !
Avatar billede arne_v Ekspert
23. september 2004 - 21:42 #29
Visual Studio må snepnet forklare
Avatar billede snepnet Nybegynder
23. september 2004 - 21:42 #30
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

namespace EXPServices
{
    public class SimpleService : System.Web.Services.WebService
    {
        public SimpleService()
        {
            InitializeComponent();
        }

        private IContainer components = null;
               
        private void InitializeComponent()
        {
        }

        protected override void Dispose( bool disposing )
        {
            if(disposing && components != null)
            {
                components.Dispose();
            }
            base.Dispose(disposing);       
        }
       
        public string HelloWorld()
        {
            return "Hello World";
        }

        [WebMethod]
        public string GetSomeResult(SomeClass someClass)
        {
            return someClass.SomeParameter;
        }
    }

    [Serializable]
    public class SomeClass
    {
        private string someParameter;

        public string SomeParameter
        {
            get{return someParameter;}
            set{someParameter = value;}
        }

        public SomeClass()
        {
            this.someParameter = String.Empty;
        }
    }
}


Hvis ovenstående er din webservice... kan du (hvis du har tilføjet webreferencen i vs) bare kode det fuldstændig som du ville have gjort hvis der var tale om "lokale" klasser.
Avatar billede snepnet Nybegynder
23. september 2004 - 21:43 #31
altså new SimpleService().GetSomeResult(new SomeClass("something"));
Avatar billede extremecode Nybegynder
23. september 2004 - 21:52 #32
tester lige
Avatar billede extremecode Nybegynder
23. september 2004 - 22:05 #33
ok det virker fint men hvad hvis jeg vil returnere et object i stedet for en string..


f.eks

[WebMethod]
public SomeClass getClass()
{
return SomeClass
}

og over på clientet køre en SomeClass sc= localhost.getClass();
String name=sc.getName();

det er det jeg ikke kan få til at virke...
Avatar billede snepnet Nybegynder
23. september 2004 - 22:08 #34
heller ikke med :
og over på clientet køre en localhost.SomeClass sc = localhost.getClass();
String name=sc.getName();

og så skal du lige sørge for at du også får lavet sådan en i din service :

[WebMethod]
public SomeClass getClass()
{
return new SomeClass();
}
Avatar billede extremecode Nybegynder
23. september 2004 - 22:27 #35
ok her er hvad jeg gør

Server:

        [WebMethod]
        public SomeClass getClass(string name)
        {
            return new SomeClass(name);
        }
                [WebMethod]
        public string getName(SomeClass sc)
        {
            return sc.getName();
        }

client:
localhost.WebService WS = new localhost.WebService();
string str =WS.getName(WS.getClass("dette er en klasse");

Str bliver null...da objectet åbenbart er tomt selvom jeg har oprette et??
Avatar billede extremecode Nybegynder
23. september 2004 - 22:30 #36
ov her er klasse

[Serializable]
private string name;
public class SomeClass{

public SomeClass(string name){
this.name=name;
}

public string getName(){
return name;
}
}
Avatar billede snepnet Nybegynder
24. september 2004 - 07:30 #37
Hej igen :o)
Du skal nok lægge din klassevariabel ind i klassen, sådan her :

[Serializable]
public class SomeClass
{
  private string name;
  public SomeClass(string name)
  {
      this.name=name;
  }

  public string getName()
  {
      return name;
  }
}

Desuden bør du lave en rebuild, og efterfølgende opdatere referencen når du laver ændringer (højreklik på webreferencen og klik på update web reference).

mvh
Avatar billede extremecode Nybegynder
24. september 2004 - 15:04 #38
Hej fandt ud af at jeg har kodet for meget i Java...grunden til at jeg ikke kunne kommer i kontakt med mit object og dets metoder var fordi at mine set og get metoder var skrevet forkert....

fandt jeg ud efter at have kigget lidt hos dig sepnet

Så hvis du lige svare får du point :)
Avatar billede extremecode Nybegynder
05. oktober 2004 - 23:18 #39
lukker her Snepnet hvis du skal have dine point skal du lige svare ellers tager jeg point selv
Avatar billede snepnet Nybegynder
06. oktober 2004 - 09:27 #40
ok :o)
mvh
Avatar billede extremecode Nybegynder
06. oktober 2004 - 15:53 #41
here you go body
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