Avatar billede cool_code Nybegynder
19. august 2007 - 20:02 Der er 36 kommentarer og
1 løsning

Webservice og databasekald

Er der nogen der kan hjælpe her, der er noget jeg ikke kan få til at hænge sammen.

Jeg har lavet en simpel Webservice ved at definere mine funktioner i en ASMX side og efterfølgende genereret en .cs fil med WSDL kommandoen. Til at få fremvist disse simple funktioner har jeg både lavet en C# Windowsklient samt en C# konsol klient og det virker fint.
Nu vil jeg gerne lave en simpel databasefunktion (Firebird Database) som henter data fra en database og returnerer en enkelt streng. Som jeg har forstået det database-kaldet jo kodes i .cs filen som kompileres til en .DLL.

Er dette rigtig forstået? Hvor skal jeg placere koden til min databasetransaction?

Lige nu har jeg placeret det i den autogeneret .CS fil, men når jeg importerer min Firebird DLL (som indeholde de funktioner jeg skal bruge), kan jeg ikke kompilere.

Er der nogen der kan hjælpe med hvordan jeg gør dette?

\\cool_code
Avatar billede arne_v Ekspert
19. august 2007 - 21:11 #1
Vil du lave:

web service client----(web service kald)----web service server----(ADO.NET kald)----Firebird

?

Så skal din server kode importere det rette namespaces og bruge de rette
Firebird klasser.

Der bør ikke være noget Firebird overhovedet i client.

Du kan godt lave det uden at producere nye EXE eller DLL.

Men du kan naturligvis godt putte din database kode som bruges af din server
i en seperat DLL (og seperat projekt).
Avatar billede cool_code Nybegynder
19. august 2007 - 22:47 #2
Hej
Ja, det er det jeg vil lave. Det er min Webservice DLL der skal lave DB-kaldet.
Når jeg laver en almindelig klasse og bruger "Using FirebirdSql.Data.Firebird" er der ingen problemer (importeret som reference i et projekt), men i min webservice server koden vil den ikke acceptere denne DLL.

Jeg viser lige et eksempel her. Min ASMX side skal indeholde følgende eksempel:
    [WebMethod(Description="Skal returnere en string fra en database")]
    public string getDBstring() {
        //SKAL DER VÆRE NOGET KODE HER??
        return aString;
    }
Denne side kompileres med WSDL og der genereres en .cs fil. Det er denne fil jeg ikke kan kompilere med min Firebird DLL.

Blev det mere forståeligt med ovenstående? :-)

\\cool code

Min DLL der indeholder database koden skal bare være i den
Avatar billede arne_v Ekspert
19. august 2007 - 23:07 #3
Din server side kode skal referere Firebird DLL (altså skal den enten være i bin dir eller i GAC).

Din server side kode skal naturligvis hente noget op af databasen.

Wsdl utility compilerer ikke siden - den genererer en client stub.

Den stub skal ikke bruge noget som helst Firebird.
Avatar billede cool_code Nybegynder
19. august 2007 - 23:24 #4
Det er nok her min film knækker for forståelsen.....

wsdl genererer en en client stub siger du...., men det er jo den jeg kompilerer til en Webservice DLL....... Derfor troede jeg at Webservice-dll var server kode.

Grunden til jeg siger ovenstående er, at hvis jeg på min ASMX-side laver følgende funktion:
    [WebMethod(Description="Returns a string with IP Number ")]
    public string IPnumber() {
        return "192.168.1.1";
    }

og bruger wsdl til at lave client stubben, så laves der jo netop .cs fil som efterfølgende kompileres til en DLL. Men hvis nu denne ipadresse i ovenstående eksempel vil have en ipadresse som ligger i en Firebird database, hvor skal denne kode så laves?

\\cool_code
Avatar billede erikjacobsen Ekspert
19. august 2007 - 23:29 #5
I mega-grove træk

    [WebMethod(Description="Returns a string with IP Number ")]
    public string IPnumber() {
      //connect til DB
      string sql="Select ip from tabellen where id=7913";
      // udfør sql
      string resultat = ....;
      return resultat;
    }
Avatar billede cool_code Nybegynder
19. august 2007 - 23:31 #6
skal koden så skrives i ASMX filen først og bruge wsdl får at få generet .cs filen?
Avatar billede erikjacobsen Ekspert
19. august 2007 - 23:33 #7
Ja. Du skal kun generere .cs-stubben til klienten igen, hvis du ændrer signaturen på dine metoder, fx sætter flere parametre på, eller tilføjer eller sletter metoder.
Avatar billede erikjacobsen Ekspert
19. august 2007 - 23:35 #8
Og så må du aldrig ændre i automatisk genereret kode - ja, jeg er da ligeglad, men det er bøvl uden lige ...

Ændrer du kun i hvordan webmetoden udfører sin opgave, ser den helt ud på samme måde for klienten, og den behøver ingen ny stub.
Avatar billede arne_v Ekspert
19. august 2007 - 23:48 #9
Hvis du skriver din C# kode direkte i .asmx skal du ikke compile noget som helst - det gør
ASP.NET for dig.

Wsdl genererer ikke noget der skal bruges på server. Wsdl generer noget der skal
bruges af client.

Og du behøver såmænd ikke compile det til en seperat DLL. Du kan også compile koden
ind i client EXE.
Avatar billede cool_code Nybegynder
19. august 2007 - 23:54 #10
Jeg har tilføjet dette i min ASMX side:

using FirebirdSql.Data.Firebird;

og den kommer med følgende fejl ved wsdl eksekvering:
C:\testServer.asmx(5,7): error CS0246: The type or namespace name 'FirebirdSql' could not be found (are you missing a using directive or an assembly reference?)

Jeg har efterhånden placeret denne fil alle steder jeg kan komme i tanke om, men lige vidt hjælper det. At lave en "using FirebirdSql.Data.Firebird;" i en almindelig C#-klient giver mig ikke problemer......
Avatar billede erikjacobsen Ekspert
19. august 2007 - 23:57 #11
Du gør som i Kommentar: arne_v 19/08-2007 23:07:08  ??
Avatar billede erikjacobsen Ekspert
20. august 2007 - 00:01 #12
Eller rettere: Du kører wsdl fra kommandolinien, og den giver fejl? Wsdl-programmet skal  vel også have at vide hvor DLL-en ligger.
Avatar billede cool_code Nybegynder
20. august 2007 - 00:02 #13
der er ikke nogen kommandolinie parametre der giver mig den mulighed i wsdl
Avatar billede erikjacobsen Ekspert
20. august 2007 - 00:07 #14
Jeg har ingenting .net på den her maskine, men ved compilering (vcb.exe csc.exe) hedder den /r:hvoerdennublevetafden.dll  - ikke det samme med WSDL??  Og så bruger jeg Visual Studio til det for tiden - jeg glemmer hvordan man gør det rigtigt ;)
Avatar billede cool_code Nybegynder
20. august 2007 - 00:08 #15
ja jeg har gjort som Arne skriver...... Weird.
Avatar billede cool_code Nybegynder
20. august 2007 - 00:11 #16
det er rigtigt at man med csc har disse muligheder, men ikke med wsdl. Jeg bruger selv klienten til at tilgå min Webservice i Visual Express men selve webservice laver jeg "i hånden"
Avatar billede erikjacobsen Ekspert
20. august 2007 - 00:15 #17
Ja, med mindre den exponeres i dine metoder, så skal det jo også være ligemeget. Det er vist lidt for sent på dagen her...?

Men kalder du dem som:  wsdl ....diverseparametre.... http://noget.noget/noget.asmx?WSDL
sådan ca., så kan den jo ikke brokke sig over hvilke DLL, der er valgt til implementationen.

Fortæl mere om hvad du gør.
Avatar billede arne_v Ekspert
20. august 2007 - 00:17 #18
Jeg kan godt lave et komplet eksempel med web service, client og database adgang. Det
bliver dog mod MySQL og ikke Firebird.
Avatar billede cool_code Nybegynder
20. august 2007 - 00:19 #19
jeg gør således:
en asmx side som sagtens kan kompileres, den tilføjer jeg "using FirebirdSql.Data.Firebird;". Herefter fra en kommando linie gør jeg følgende: wsdl "http://computernavn/testServer/testServer.asmx?WSDL" /out:testServer.cs

og med using firebird.... kommer ovenstående fejl.
Avatar billede cool_code Nybegynder
20. august 2007 - 00:20 #20
arne, et simpelt eksempel vil være fint.... for forståelsen, om det er Firebird eller MySQL er ligemeget, kender dem ligegodt, dog er problemet også med Firebird-Dll'en....
Avatar billede erikjacobsen Ekspert
20. august 2007 - 00:20 #21
Og ser du
  http://computernavn/testServer/testServer.asmx?WSDL
direkte i en browser, så siger den hvad?
Avatar billede cool_code Nybegynder
20. august 2007 - 00:24 #22
så kommer den med den velkendte Webservice funktionsbeskrivelses side i XML-format, laver jeg browser kaldet, kommer funktionslisten i mere "læselig" form, men det er jo kompileret uden "using FirebirdSql.Data.Firebird"
Avatar billede erikjacobsen Ekspert
20. august 2007 - 00:25 #23
Så skal du gøre det samme med "using FirebirdSql.Data.Firebird" - hvis du får fejlen i browseren, så er det fordi webserveren ikke ved hvor DLL-en er, og så skal du følge Arnes anvisninger.
Avatar billede cool_code Nybegynder
20. august 2007 - 00:31 #24
Her kommer fejlen fra browseren med "using":


Compilation Error
Compiler Error Message: CS0246: The type or namespace name 'FirebirdSql' could not be found (are you missing a using directive or an assembly reference?)
Line 3:  using System;
Line 4:  using System.Web.Services;
Line 5:  using FirebirdSql.Data.Firebird;

Så ja, den kan ikke finde min DLL, men det er pudsigt, den ligger jo snart i alle foldere på min PC :-) Hvor skal jeg placere den så den kan genkendes?
Avatar billede erikjacobsen Ekspert
20. august 2007 - 00:32 #25
I webroden som ses af IIS ligger der et katalog "bin". Deri skal du prøve at lokke DLL-en ned.
Avatar billede cool_code Nybegynder
20. august 2007 - 00:34 #26
Der ligger den allerede i en folder "\bin".
Skal den registreres i IIS'en?
Avatar billede erikjacobsen Ekspert
20. august 2007 - 00:34 #27
Og når du skriver:

  C:\testServer.asmx(5,7): error CS0246: ....

så er det ikke fordi .asmx filer ligger i roden af C:\  ?  Det bliver noget rod ... ;)
Avatar billede erikjacobsen Ekspert
20. august 2007 - 00:34 #28
Hvad er webroden for dit site på din IIS ?
Avatar billede cool_code Nybegynder
20. august 2007 - 00:39 #29
C:\Webservice og der ligger så min ASMX fil. Der er også oprettet en bin-folder. Jeg har lagt Firebird-dll'en i både roden og bin (for at være sikker), men den kan stadig ikke finde den.
Avatar billede cool_code Nybegynder
20. august 2007 - 00:56 #30
gjorde lige noget desperat, gik ind i min IIS og ændrede .net sprog --> apply og ændrede den tilbage igen. Nu kunne den godt læse min DLL. Jeg kan nu indsætte data via min webservice. Men jeg har ikke ændret i strukturen, ej heller på placeringen af Firebird-dll....hmmmmm det må være en microsoft bug da det jo var IIS'en der ikke tog rigtig fat i konfigurationen.

EDt viste også jeg har meget at lære endnu omkring webservices, da forståelsen omkring asmx-filen ikke var helt forstået. Vil i dele pointene. Lav et svar.

Tak for hjælpen begge to...

\\cool_code
Avatar billede arne_v Ekspert
20. august 2007 - 01:11 #31
Nu havde jeg ellers mit eksempel klar.

:-)
Avatar billede arne_v Ekspert
20. august 2007 - 01:12 #32
C:\Inetpub\wwwroot\bin\MySql.Data.dll eksisterer
Avatar billede arne_v Ekspert
20. august 2007 - 01:12 #33
C:\Inetpub\wwwroot\GetData.asmx med indhold:

<%@ WebService Language="C#" Class="E.GetData" %>
using System;
using System.Data;
using MySql.Data.MySqlClient;
using System.Web.Services;

namespace E
{
    public class GetData : WebService
    {
        [WebMethod]
        public string GetF2(int f1)
        {
            MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password=");
            con.Open();
            MySqlCommand sel = new MySqlCommand("SELECT f2 FROM t1 WHERE f1 = ?f1", con);
            sel.Parameters.Add("?f1", MySqlDbType.Int32);
            sel.Parameters["?f1"].Value = f1;
            string res = (string)sel.ExecuteScalar();
            con.Close();
            return res;
        }
    }
}
Avatar billede arne_v Ekspert
20. august 2007 - 01:13 #34
Client side:

C:\>wsdl /language:cs http://localhost/GetData.asmx?WSDL
Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 2.0.50727.42]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\GetData.cs'.

C:\>type Client.cs
using System;

public class Client
{
    public static void Main(string[] args)
    {
        GetData gd = new GetData();
        string f2 = gd.GetF2(2);
        Console.WriteLine(f2);
    }
}

C:\>csc Client.cs GetData.cs
Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.


C:\>Client.exe
BB
Avatar billede arne_v Ekspert
20. august 2007 - 01:14 #35
Forhåbentligt for en elle randen lidt nytte af eksemplet.
Avatar billede arne_v Ekspert
20. august 2007 - 01:14 #36
Og et svar fra mig.
Avatar billede arne_v Ekspert
22. september 2007 - 21:22 #37
Tid at få afsluttet her ?
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