Laden...

datei per webservice übertragen

Erstellt von Molta vor 18 Jahren Letzter Beitrag vor 17 Jahren 8.057 Views
M
Molta Themenstarter:in
103 Beiträge seit 2005
vor 18 Jahren
datei per webservice übertragen

hallo erstmal =)

hab schon paar tage hier in dem forum gelesen aber leider keine lösung für mein problem gefunden.

ich muss ein programm schreiben das daten aus einem sql server holt in einer xml datei speichert, dann über port 80 einem anderen server dazu bringt sich diese datei per webservice zu holen und dort wieder in einer datenbank speichert.

also das auslesen und speichern in einer xml datei hab ich schon 🙂 so weit so gut 😉 aber beim erstellen vom webservice der mir die daten transportiert hab ich ka wie ich anfangen soll. ich hoffe mir kann hier einer helfen 😉

N
61 Beiträge seit 2005
vor 18 Jahren

Erstelle aus deinem XML einen MemoryStream. sende Diesen Stream an Client. Dieser könnte ihn direkt als Datei speichern oder was er sonst damit machen will. Du kannst das ganze aber auch als String verschicken. Ich denke mal der Client will das Teil eh gleich verarbeiten.
Mein Code wie ichs mir vorstelle:


[WebMethod]
public Stream GetXmlFile(string SQL)
{
MemoryStream _file = new MemoryStream();

_file = GetXml(SQL); // Deine Private Funktion
return _file;
}

Wenn man drüber nachdenkt, könnte man auch direkt einen Instert Befehl versenden. Du speicherst den Datensatz/sätze eh in der DB auf der anderen Seite. So würde ich es machen.
Ich hoffe das ist die Antwort auf deine Frage.

M
Molta Themenstarter:in
103 Beiträge seit 2005
vor 18 Jahren

danke für die antwort

ich habs nun mit einem networkstream versucht bekomm das aber einfach nicht gebacken X(

Client


IPAddress ip = IPAddress.Parse("xxx.xxx.xxx.xxx");
int port = 80;
IPEndPoint remoteEP = new IPEndPoint(ip,port);
Socket Sender = new Socke(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
Sender.Connect(remoteEP);
NetworkStream stream = new NetworkStream(Sender);
byte[] bytesDaten = System.Text.Encoding.ASCII.GetBytes(ds.ToString());
stream.Write(bytesDaten,0,bytesDaten.Length);
Sender.Close();

Server


string data;
int port = 80;
IPAddress ip = IPAddress.Parse("xxx.xxx.xxx.xxx");

TcpListener server = new TcpListener(ip,port);
server.Start();
while(1!=0)
{					
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
int i;
byte [] bytes = new byte[256] ;
while((i = stream.Read(bytes,0,bytes.Length))!=0)
{
data = System.Text.Encoding.ASCII.GetString(bytes,0,i);
return data;
}
client.Close();
}

ip is bei beiden bei mir zu testzwecke die selbe aber das sollte ja egal sein. würd nur mal gern wissen ob das so in der richtung überhaupt funktionieren kann oder ob es total falsch ist 😁 das ich da noch nichts in ne datenbank schreib oder auslese is nu erstmal nebensächlich. will wie gesagt erstmal wissen ob das so in die richtung überhaupt geht 😉

N
61 Beiträge seit 2005
vor 18 Jahren

Hab mich nochmal informiert. Du solltest Datei auf keinen Fall uncodiert als String zum Client senden, da es dabei Zeichen gibt, die er im XML beim versenden nicht codieren kann.
Anderer Vorschlag. Zersetze dein Stream in Byte pakete und speichere diese als Byte-Array. Danach sendest du das Byte-Array an den Client welcher es wieder als Stream und somit als Datei umwandelt. Ungefähr so:


[WebMethod]
public byte[] GetXmlFile(string SQL)
{
MemoryStream _file = new MemoryStream();
_file = GetXML(SQL); // Deine Private Funktion welche die Datensätze als XML speichert u. als Stream sendet
return _file.ToArray;
}

Am Client würde das so aussehen:


MeinWebService f_GetFile;
byte[] bytesDerDatei;
MemoryStream _NewFile = new MemoryStream();

bytesDerDatei = f_GetFile.GetXmlFile("SELECT * FROM tblTest";);
_NewFile.Write(bytesDerDatei,0,bytesDerDatei.LongLenght);

//Tada, deine Datei liegt beim Client.

Ich hoffe, du verstehst was ich meine.
Eine Frage noch. Was willst du mit irgendwelchen IPs? Bei einem WebService musst du doch nichts mit IPs machen oder haben die eine andere Funktion. Ich glaub auch kaum, dass du per SOAP einen Netzwerkstream verschicken kannst. Als was da versendet wird sind XML Daten.

M
Molta Themenstarter:in
103 Beiträge seit 2005
vor 18 Jahren

danke aber ich meinte das eigentlich andersrum
der client hat die xml datei soll sie aber an den server schicken

das soll am schluss mal so laufen dass das programm beim clienten 2-3 mal am tag gestartet wird und bestimmte datensätze in ein xml feil packt dieses dann an den server schickt und der das is seine datenbank einträgt

N
61 Beiträge seit 2005
vor 18 Jahren

Oh, haben wir aneinander vorbeigeredet. Naja, für andere Forumuser trotzdem hilfreich.
Anderer Vorschlag. Würdest du dich zufrieden geben, wenn du deine XML File als Upload über eine ASPX Seite an den Server schickst und er sie dann somit verarbeitet? Den Web Dienst kann dir nur Dienste bieten. Wie der Name schon sagt.

Das einzige was du machen könntest ist, wenn du deine XML Datei als Parameter an den Service sendest und er diese mit deiner DB synchronisiert.
Einfach mal ausprobieren.

M
Molta Themenstarter:in
103 Beiträge seit 2005
vor 18 Jahren

ich hab im grunde genommen nur die aufgabe bekommen xml datei von einem server zum zweiten zu übertragen und dort wieder einbinden in die datenbank
mir wurde auch noch gesagt das ganze soll per soap passieren =)
naja und über das thema soap bin ich halt auf webdienste gekommen. hab heut dann ganzen tag mit streams rumgemacht aber mir is nun hinten und vorn nimmer klar wie ich das nun eigentlich anstellen soll ^^

L
6 Beiträge seit 2006
vor 17 Jahren

Hallo Community.
Ich greife diesen alten Thread mal wieder auf, da ich im Moment an einem ähnlichen Problem arbeite.

Folgende Sachlage: Ich habe eine Datenbank daraus generiere ich mir eine Excel-Datei. Diese Datei soll dann in XML abgebildet werden. (das soll angeblich ab Excel 2003 möglich sein)
Auf dem Server läuft ein Webservice der die ganze Kommunikation steuert. Mit Hilfe des Webservices will ich nun das XML-File(die Excel-Datei) an den Client senden, um auf dem Client aus dem XML-File wieder eine Excel-Datei zu erstellen.

Die Frage ist nun, wie ich das XML-File am besten übertrage? Umwandeln in ein byte-Array, um dann ne Methode zu schreiben die ein byte-Array zurück gibt? Wie groß darf das XML-File dann sein, da das byte-Array ja nicht unbegrenzt Daten aufnehmen kann. (Die Datentabelle aus der letztendlich das XML-File erstellt wird ist ziemlich groß).
Oder sollte ich das ganze in einen string umwandeln und dem Webservice übergeben?

Hat vielleicht jemand Erfahrung damit gemacht, oder einen besseren Vorschlag?

Viele Grüße

S
8.746 Beiträge seit 2005
vor 17 Jahren

Grundsätzlich ist der Weg über ein Byte-Array als Parameter eines WebServices richtig. Folgende Probleme ergeben sich aber:

  1. Auf Serverseite wird der Call komplett im Speicher gehalten, damit also die gesamte Datei. Das kann Probleme mit dem IIS hervorrufen, der HTTP-POSTS gerne in der Größe beschränkt (4MB). Die Zahl gleichzeitiger Aufrufe ist ebenfalls durch die Hauptspeichergröße begrenzt.

  2. Durch das Marshalling nach SOAP wird der Dateiinhalt nach base64 encodiert. Das vergrößert nochmal um 33%

Ein tendenziell eleganterer Weg ist die Verwendung von WCF bzw. WSE 3.0 in Kombination mit Anhängen (WS-Attachment). Das wird so gemacht, dass ein Stream als WebService-Parameter übergeben wird, über den die Daten dann direkt auslesar sind. Hier wird MTOM verwendet um die Daten als Binär-Anhänge zu verschicken. base64-Encoding entfällt dadurch.

Läuft leider nicht unterhalb von WSE 3.0 (also z.B. auch nicht mit Compact Framework). WSE 2.0 verwendet nicht DIME anstelle von MTOM.

Die "Standardvariante" ist also "kompatibler", aber auch weniger effizient.

Beispiel für sowas findest du unter Codeprojekt.

Bei großen Dateien wirst du aber ebentuell auch Resuming wollen, also Fortsetzen der Übertragung nach Abbruch. Hier kommst du um ein eigenes "Chunking-Protokoll" nicht herum, also Zerlegen in Blöcke. Hier musst du dich insbesondere um ein Sessionhandling kümmern.

Q
992 Beiträge seit 2005
vor 17 Jahren

Wieso verschickst du nicht gleich die Excel-Datei? Das wandeln in XML ist doch echt quatsch, wenn du es sowieso nur binär verschickst.

Grüße, Christoph

S
8.746 Beiträge seit 2005
vor 17 Jahren

Jo. Wenn mit XML SOAP gemeint ist, dann übernimmt .NET das Verpackens des Binärschleims. Musst du also nicht explizit behandeln, sondern einfach aus der Datei ein Byte-Array machen und dem WS übergeben.

L
6 Beiträge seit 2006
vor 17 Jahren

Danke schonmal für die Antworten. Die Konzeption der Files ist noch nicht ganz klar.
Sicher ist nur das der Webservice Daten aus einer DB holen soll und diese dann zum Client sendet. In welcher Form weiß ich nocht nicht genau. (DataSet, Excel File, Xml)
Diese Daten(tabelle) soll(en) auf jeden Fall auf dem Client mit Excel bearbeitet werden und dann zurück in die Datenbank geschrieben werden.
IN welchem Format das passiert ist mir noch nicht so ganz klar (wie geht Excel zB. mit DataSets aus .NET um?)

Also wenn einer einen guten Vorschlag hat, immer her damit. Welches Format ist denn da am besten geeignet, wenn auch mal größere Tabellen versendet werden sollen?!

MfG