19. august 2007 - 20:02Der 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?
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
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?
[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; }
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.
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......
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 ;)
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"
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.
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.
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....
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"
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.
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?
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.
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.
<%@ 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; } } }
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.
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.