Benutzer mit den meisten Antworten
Silverlight + Webseite - Wie bekomme ich eine einfache File List vom Server

Frage
-
Hallo!
Die Kurze Version meines Problems steht am Ende, letzte Zeile ;-) Mir ist klar das nicht jeder alle Infos lesen will / muss.
Folgendes (einfaches?) Problem stellt sich mir:
Ich habe eine Webseite in die ich eine mit Silverlight erstellte Bildergallerie einfügen möchte. Das erstellen der Gallerie selber geht dank Expression Blend wie von selbst und in gewünschter Qualität. Nur wie kann ich nun eine DYNAMISCHE Liste von Bildern einbinden?
- Bilder in die XAP Datei einbinden geht, bei steigender Anzahl aber wohl nicht wünschenswert.
- Bilder per
Bilderliste.Add(AddPicture("http://..../....jpg")); BildListBox.ItemsSource = Bilderliste;
einfügen geht ebenfalls ohne Probleme und ist schon sauberer. - die URL der Bilder abfragen und dann per Schleife automatisch in die Liste adden lassen geht bisher NICHT.
Es gibt eine breite Reihe an Dingen die ich probiert habe (rund 16h über die letzten 3 Tage), alle möglichen und unmöglichen Googlesuchen und Try and Error. Die meisten Beispiele die ich finde funktionieren mit Silverlight nicht weil irgend ein Verweis für Silverlight nicht verfügbar ist, oder weil die Beispiele schlicht Codefehler(bzw. Änderrungen seit Tutorialerstellung, da die meisten von SL 1 und 2 kommen) haben die ich selbstständig nicht finde oder beheben kann.
Mein Problem sah anfangs so einfach aus, aber langsam verzweifle ich ein klein wenig. Es kann doch net so schwer sein einfach die vorhandenen Dateien in einem Webfolder abzufragen. In Php hatte ich das in 30sec mit nem Einzeiler *verzweifel*
Weitere Informationen die bei der beantwortung helfen können:
Ich bin mir bewusst wie Silverlight arbeitet und das ich irgendeinen Vermittler (oder Ähnliches) zwischen Server und Silverlight benötige. Was mir nicht bewusst ist: Welche der gefühlten 50 Methoden funktioniert mit aktuellem Silverlight auch wirklich?
Und ich bin mir auch bewusst das ich aktuell nicht weiter komme mit irgendwelchen Links und in den Raum geworfenen Dingen wie "Nutz nen Webservice", ich brauche einfach ein Codebeispiel das für mein spezielles Problem gemacht ist. Sehe mittlerweile sicher den Wald vor Bäumen nimmer leider.
Also: Wie realisiere ich die Brücke zwischen Silverlight und Webserver um in Silverlight eine List<string> mit den Webpfaden aller Bilddateien eines EINZELNEN Ordners auf dem Webserver zu erhalten?
Danke schon im Vorraus für die Hilfe!
- Bearbeitet Marco Heumann Dienstag, 8. November 2011 15:34
Dienstag, 8. November 2011 15:32
Antworten
-
Nun sind ja noch mal ein paar Wochen ins Land gezogen und ich habe immer mal wieder probiert Lösungen zu finden. Heute bin ich dann ENDLICH fündig geworden. Mit zusammengeschustertem Code aus 7 (!) Tutorials.
Der Vollständigkeit halber will ich das hier natürlich veröffentlichen, falls andere auch danach suchen. Man verzeie mir die etwas stümperhafte Umsetzung, man könnte das sicher auch kürzer machen ;-)
Zuerst der Code der PHP-Datei auf dem Server
<?php class Bilderpfade { public $pfad; } if(isset($_GET['getBilder'])) { $Bildarray = array(); foreach (glob("*.jpg") as $bildname ) { $Bildarray[] = (basename($bildname)); } $b = new Bilderpfade(); $b->pfad = $Bildarray; echo json_encode($b); } ?>
Keine großen Wunder hier, dazu gibt es tonnen an Material im Web. Es wird einfach alles im Ordner das auf .jpg endet abgefragt und in ein Array unter dem Schlüssel "pfad" gespeichert und als json_Encode ausgegeben.Nun zu der Asyncronen Abfrage in Silverlight:
//soll ausgeführt werden wenn auf die Bar geklickt wird. private void Bar_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { //webclient gestartet WebClient wc = new WebClient(); //neuer Event erzeugt wc.OpenReadCompleted += GetBilderOpenReadCompleted; //async anfrage an die PHP-Datei auf dem Server wc.OpenReadAsync(new Uri("http://beispielurl.de/phpdatei.php?getBilder=true")); } //Wenn die Abfrage durch ist passiert das hier... private void GetBilderOpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { //wenn nix zurück kam aus irgend nem grund... if (e.Error != null) { //Fehlermessage anzeigen! MessageBox.Show(e.Error.ToString()); return; } //wenn die Abfrage abgebrochen wurde... if (e.Cancelled) { //sag mir das es abgebrochen wurde MessageBox.Show("Cancelled"); return; } //Schon mal ne Liste für die Bilder erstellen List<Picture> Bilderliste = new List<Picture>(); //aus dem JSON Stream der php-Datei machen wir jetzt einen String StreamReader reader = new StreamReader(e.Result); string json = reader.ReadToEnd(); //und diesen String wandeln wir in ein Objekt um zum arbeiten JObject jsonObjekt = JObject.Parse(json); //nun lesen wir das Array "pfad" mit all den Addressen aus und packen es in ein normales Array JArray Bilderpfade = (JArray)jsonObjekt["pfad"]; //jeden vorhandenen Pfad adden wir zur Bilderliste foreach (string pfad in Bilderpfade) { Bilderliste.Add(AddPicture("http://beispielurl.de/"+pfad)); } //nun wird die Bilderliste noch als Source für die Listbox genommen und fertig! lbImage.ItemsSource = Bilderliste; }
Tada! Eine Silverlight Anwendung / Bildergallerie, die keines der Bilder in die XAP packen muss und die Bilder auch erst läd wenn sie sich wirklich jemand ansehen will. Dazu dynamisch aus einem Webordner, ohne Codeanpassungen machen zu müssen.An dieser Stelle sollte es dann auch kein Problem mehr darstellen das Ganze hübscher zu machen. z.B. mit Kategorien, Titeln, Beschreibungen ect ect.
Danke noch mal für die Hinweise auf jeden Fall! :-)
- Als Antwort vorgeschlagen Daniel Bedarf Montag, 5. Dezember 2011 12:42
- Als Antwort markiert Marco Heumann Donnerstag, 8. Dezember 2011 17:39
Sonntag, 4. Dezember 2011 03:01
Alle Antworten
-
Hallo Marco,
welchen Webserver verwendest Du?
Wenn Du ein fertiges PHP Skript hast, warum nutzt Du das nicht einfach?
Mit welcher Technologie arbeitest Du serverseitig, wenn nicht mit PHP?
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET CommunityDienstag, 8. November 2011 15:37 -
Hallo!
Zu Frage 1: Ich verwende einen Server von Alfahosting. So weit mir bekannt ist das ein Apache Server.
Zu Frage 2: Ich bin vor einer Woche eingestiegen mit Webdevelopment und bin wohl noch etwas zu grün hinter den Ohren. Mir war nicht bewusst das ich ein php Script in Silverlight nutzen kann? Wie genau würde ich das denn umsetzen?
Der Code in dem Script ist einfach nur da um die Abfrage zu machen und das Ergebnis in ein XML Dokument zu speichern (ich hatte den Umweg über XML auch versucht) und auf dem Bildschirm die Pfade ebenfalls auszugeben um zu überprüfen ob alles funktioniert. Hier der Code:
<?php $bilder = array(); foreach (glob("*.jpg") as $file ) { $urlplatz = 'http://Zaradoom.Alfahosting.org/bilder/' . basename($file); $bilder [] = array( 'BildURL' => $urlplatz ); } $doc = new DOMDocument(); $doc->formatOutput = true; $r = $doc->createElement( "bilder" ); $doc->appendChild( $r ); foreach( $bilder as $bild ) { $b = $doc->createElement( "bild" ); $bildurl = $doc->createElement( "BildURL" ); $bildurl->appendChild( $doc->createTextNode( $bild['BildURL'] ) ); $b->appendChild( $bildurl ); $r->appendChild( $b ); } echo $doc->saveXML(); $doc->save("bilder.xml") ?>
Was müsste ich den umstellen um mit dieser php datei die Daten in meine Silverlightanwendung zu übergeben?Zu Frage 3: Ehm, Serverseitig. Bedeutet welchen Code ich für die Webseite verwende in die ich Silverlight einbette? Das wäre in dem Fall ganz einfaches HTML mit CSS um zwei Ramen zu erzeugen und etwas php um halt das Silverlightprojekt in die 2 Div contents einzufügen.
Danke für die schnelle Reaktion. Ich bin schon wieder ne ecke zuversichtlicher :-)
Dienstag, 8. November 2011 16:17 -
Hallo Marco,
Silverlight ist etwas rein clientseitiges wie bspw. Flash, HTML, ...
Der Server liefert hier jeweils nur statische Dateien aus, die vom Client interpretiert werden.
D.h. also auch, dass es völlig egal ist, auf welcher Art Webserver (Abahatschi, IIS, ...) die Silverlight Dateien liegen, hauptsache der Server liefert diese korrekt aus.
Daher kannst Du serverseitig problemlos auch ein PHP Skript hinterlegen, welches die von dir gewünschte Ausgabe erzeugt. Diese kannst Du dann bspw. über einen HttpWebRequest oder per WebClient.DownloadString( ... ) von Silverlight aus aufrufen, den Inhalt auseinanderpflücken und daraus dann die gewünschte Ausgabe in Silverlight aufbauen.
Was genau Du an deinem PHP Skript ändern müsstest, weiß ich nicht. Bin ja auch kein PHP Entwickler :) Grundsätzlich wäre es aber wohl hilfreich, anstelle von $doc->save("bilder.xml") dafür zu sorgen, dass $doc in den Ausgabestream (Response) geschrieben wird. Wie das in PHP geht -> keine Ahnung :)
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET CommunityDienstag, 8. November 2011 17:21 -
Vielen dank für die Infos.
Ich werde dann dahingehend etwas weiter rumspielen und codebeispiele suchen. Nun bin ich ja wenigstens so weit das ich weiß wo ich suchen soll hehe.
Verstehe ich das also richtig, dass ich diese php datei in dem Ordner belassen muss in dem die Bilder sind (oder die Pfadangabe in der phpDatei ändern),... von Silverlight aus rufe ich dann quasi direkt diese Webadresse mit der Datei auf und stat das dann die Seite aufgeht, bekomme ich die inkludierten Daten in Rohform zum weiterverarbeiten?
Bisher war ich der Meinung eine Php-Datei kann nur direkt im Browser geöffnet werden und verrichtet dort ihr Ding.
Dienstag, 8. November 2011 17:31 -
Hallo Marco,
Verstehe ich das also richtig, dass ich diese php datei in dem Ordner belassen muss in dem die Bilder sind (oder die Pfadangabe in der phpDatei ändern),... von Silverlight aus rufe ich dann quasi direkt diese Webadresse mit der Datei auf und stat das dann die Seite aufgeht, bekomme ich die inkludierten Daten in Rohform zum weiterverarbeiten?
Genau so.Bisher war ich der Meinung eine Php-Datei kann nur direkt im Browser geöffnet werden und verrichtet dort ihr Ding.
Nein. Nur die HTML (und ggfs. JavaScript + CSS) Rückgabe wird vom Browser interpretiert. Das PHP Skript selbst läuft nur auf dem Webserver.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET CommunityDienstag, 8. November 2011 19:58 -
Da bin ich wieder. Einige graue Haare später... mit einer phpdatei die nun wunderschön nur die Adressen, in Zeilen getrennt darstellt (auch im Quellcode). Und eine Funktion die genau diese Zeilen einzeln ausliest und an meine Bildergallerie weiterleitet.
Problem: Silverlight erkennt weder getResponse() noch credentials. Die Sache funktiniert also toll in einer Consolenanwendung, aber nicht in meinem Projekt. Hier der Code:
public static void Main(string[] args) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://zaradoom.alfahosting.org/bilder/phptest.php"); // Set some reasonable limits on resources used by this request request.MaximumAutomaticRedirections = 4; request.MaximumResponseHeadersLength = 4; // Set credentials to use for this request. request.Credentials = CredentialCache.DefaultCredentials; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Get the stream associated with the response. Stream receiveStream = response.GetResponseStream(); // Pipes the stream to a higher level stream reader with the required encoding format. StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); string line; while ((line = readStream.ReadLine()) != null) { Console.WriteLine(line); //gibt "http://zaradoom.alfahosting.org/bilder/Tag_1.jpg" aus. } response.Close(); readStream.Close(); Console.ReadLine(); }
Das Ding läuft perfekt und wie ein 1er in WPF, C# und Konsole. Aber sobald Silverlight dazu gehört ist Ende.
Kann man diesen Code irgendwie anpassen damit Silverlight damit klar kommt? Oder brauche ich nur andere Using Dinger als in der Konsolenanwendung?So nah dran, nach so vielen tagen. Und dann von so was aufgehalten... das tut echt weh :(
- Bearbeitet Marco Heumann Dienstag, 8. November 2011 22:14
Dienstag, 8. November 2011 22:11 -
Hallo Marco,
in Silverlight läuft sowas in fast allen Fällen asynchron. Schau mal hier, da findest Du ein Beispiel.
http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest%28v=vs.95%29.aspx
Hier eine weitere Erklärung mit Beispielen:
http://msdn.microsoft.com/en-us/library/cc189021%28vs.95%29.aspx
Ich hatte im zweiten Posting versehentlich die normale Klasse verlinkt, die Klasse in Silverlight ist etwas abgespeckt.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan Falz Mittwoch, 9. November 2011 07:22
Mittwoch, 9. November 2011 07:21 -
Leider ist der Beispielcode schlicht falsch und unvollständig, wie mehrfach bemängelt in den Kommentaren.
Die "korrigierte" Version ist nicht Silverlightkompatibel, zumindest steht nicht dabei das Silverlight sie unterstützt.
Ich stehe also genau da wo ich gestern stand: Kurz davor und doch so weit weg. Ist es nicht möglich den Beispielcode aus diesem Beispiel naja... zu korrigieren? So das er funktioniert? Mit einem Code der selber nicht funktioniert kann man reichlich wenig anfangen, bzw. daraus lernen. Ich stocher nun schon wieder 3h im Leeren rum und rate was an dem code falsch ist. :-(
Mittwoch, 9. November 2011 19:19 -
Hallo Marco,
sorry, dass der Code falsch ist, hab ich so nicht gesehen.
Ich werd morgen mal ein funktionierendes Beispiel aufbauen und den Code dann hier oder in meinem Blog posten (dann steht da wenigstens auch mal was^^)
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET CommunityMittwoch, 9. November 2011 19:26 -
Das wäre mehr als hilfreich. Ich finde zwar eine Menge an Blogs, aber keines der Beispiele scheint zu funktionieren.
Hier ein weiteres Beispiel: http://blogs.msdn.com/b/silverlight_sdk/archive/2008/04/01/using-webclient-and-httpwebrequest.aspx
Positiv: Der Code wirft ENDLICH mal keine direkten Fehler aus!
Positiv: Direkter Vergleich zwischen WebClient und HTTPWebRequest
Negativ: es sollte zwar bei einem Error der Error in den textblock ausgegeben werden, dies passiert aber nicht. Der Errorstring ist wie es aussieht leer.
Der Versuch meine phpdatei stat dem im Beispiel aufgeführten einzupflegen schlug fehl (ich habe natürlich die + zahl + api Dinger rausgelöscht).
Wenn Du also ein Codebeispiel schreibst, wäre ich unglaublich dankbar wenn es einfach gehalten bleibt. Ohne viel "Bonus". Wenn das Ganze erst mal funktioniert kann man ja problemlos selbstständig Dinge adden, dann sieht man selber ob das geaddete richtig ist. Bei einem sehr aufgeblasenen Beispiel ist es schwer bis unmöglich Fehler zu finden, bzw. zu erkennen wo man Anpassungen ect. vornehmen kann ohne den Code zu zerstören.
Das von mir genannte Beispiel hier ist z.B. wunderschön aufgebaut. Aus irgendeinem Grund funktioniert es halt nicht ;-) Würde Dir auch anbieten direkt den Pfad zu meiner php-Datei zu nutzen. Quasi nur um sicherzustellen das auch das bei raus kommt was soll.
Edit: Ich habe natürlich auch nichts dagegen wenn Du eine "professionelle" Lösung für die Problemstellung findest. Sprich: Etwas nach nicht so zusammengeschustert ist wie meine phpdatei *hust*. Soooo schwer kann es doch nicht sein ein paar jpg dateien in einem Webordner abzufragen und die Links in Silverlight auszugeben. *abwink*- Bearbeitet Marco Heumann Mittwoch, 9. November 2011 20:36
Mittwoch, 9. November 2011 19:56 -
Nun sind ja noch mal ein paar Wochen ins Land gezogen und ich habe immer mal wieder probiert Lösungen zu finden. Heute bin ich dann ENDLICH fündig geworden. Mit zusammengeschustertem Code aus 7 (!) Tutorials.
Der Vollständigkeit halber will ich das hier natürlich veröffentlichen, falls andere auch danach suchen. Man verzeie mir die etwas stümperhafte Umsetzung, man könnte das sicher auch kürzer machen ;-)
Zuerst der Code der PHP-Datei auf dem Server
<?php class Bilderpfade { public $pfad; } if(isset($_GET['getBilder'])) { $Bildarray = array(); foreach (glob("*.jpg") as $bildname ) { $Bildarray[] = (basename($bildname)); } $b = new Bilderpfade(); $b->pfad = $Bildarray; echo json_encode($b); } ?>
Keine großen Wunder hier, dazu gibt es tonnen an Material im Web. Es wird einfach alles im Ordner das auf .jpg endet abgefragt und in ein Array unter dem Schlüssel "pfad" gespeichert und als json_Encode ausgegeben.Nun zu der Asyncronen Abfrage in Silverlight:
//soll ausgeführt werden wenn auf die Bar geklickt wird. private void Bar_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { //webclient gestartet WebClient wc = new WebClient(); //neuer Event erzeugt wc.OpenReadCompleted += GetBilderOpenReadCompleted; //async anfrage an die PHP-Datei auf dem Server wc.OpenReadAsync(new Uri("http://beispielurl.de/phpdatei.php?getBilder=true")); } //Wenn die Abfrage durch ist passiert das hier... private void GetBilderOpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { //wenn nix zurück kam aus irgend nem grund... if (e.Error != null) { //Fehlermessage anzeigen! MessageBox.Show(e.Error.ToString()); return; } //wenn die Abfrage abgebrochen wurde... if (e.Cancelled) { //sag mir das es abgebrochen wurde MessageBox.Show("Cancelled"); return; } //Schon mal ne Liste für die Bilder erstellen List<Picture> Bilderliste = new List<Picture>(); //aus dem JSON Stream der php-Datei machen wir jetzt einen String StreamReader reader = new StreamReader(e.Result); string json = reader.ReadToEnd(); //und diesen String wandeln wir in ein Objekt um zum arbeiten JObject jsonObjekt = JObject.Parse(json); //nun lesen wir das Array "pfad" mit all den Addressen aus und packen es in ein normales Array JArray Bilderpfade = (JArray)jsonObjekt["pfad"]; //jeden vorhandenen Pfad adden wir zur Bilderliste foreach (string pfad in Bilderpfade) { Bilderliste.Add(AddPicture("http://beispielurl.de/"+pfad)); } //nun wird die Bilderliste noch als Source für die Listbox genommen und fertig! lbImage.ItemsSource = Bilderliste; }
Tada! Eine Silverlight Anwendung / Bildergallerie, die keines der Bilder in die XAP packen muss und die Bilder auch erst läd wenn sie sich wirklich jemand ansehen will. Dazu dynamisch aus einem Webordner, ohne Codeanpassungen machen zu müssen.An dieser Stelle sollte es dann auch kein Problem mehr darstellen das Ganze hübscher zu machen. z.B. mit Kategorien, Titeln, Beschreibungen ect ect.
Danke noch mal für die Hinweise auf jeden Fall! :-)
- Als Antwort vorgeschlagen Daniel Bedarf Montag, 5. Dezember 2011 12:42
- Als Antwort markiert Marco Heumann Donnerstag, 8. Dezember 2011 17:39
Sonntag, 4. Dezember 2011 03:01