C# ASP.NET Bilder an Website streamen

Fou-Lu

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
290
Hallo an alle CBler,
hätte noch einige Fragen/Probleme bezüglich ASP.NET, hoffe ihr könnt mir weiterhelfen.

Hab ja schon letzte Woche wegen WCF Diensten in ASP.NET nachgefragt. Das hab ich ja nun zum laufen bekommen...

Nun wollte ich aber paar Schritte weitergehen und stoße wieder mal auf ein Problem.
Meine Idee war über den verbundenen WCF Dienst z.B. Bilder zu empfangen und diese dann auf der Homepage zu aktualisieren...

Man könnte eig. sagen streamen... ob es nun ne ein Ordner mit Fotos/Bildern oder Screens vom Desktop sind... ich rufe eine Funktion im WCF Dienst auf, bekomme ein Bild als byte-Array zurück. Dieses wandle ich dann wieder in ein Bild um und lass es anzeigen auf der Homepage.

Funktioniert auch alles soweit. Mein Problem besteht aber darin, dass wenn ich den Timer z.B. im Millisekundenbereich einstelle (vom Interval her), dann "ruckelt" das Bild auf der Website... es wird eingeblendet, dann im nächsten Moment wieder ein leeres Bild bzw. das Image-Tag nur grau und dann wird es wieder eingeblendet... und so geht es die ganze Zeit daher....

Meine Frage wäre nun ob es eine Möglichkeit gibt das vielleicht flüssig darzustellen? Ohne das ruckeln bzw. ein/aus-blenden!


PHP:
// Timer-Event
protected void dataThread_Tick(object sender, EventArgs e) {
	try {
		string str = RandomString(5, true);

		imgBild.ImageUrl = "image.aspx?" + str;
	} catch (Exception ex) {
		lblException.Text = ex.Message;

		dataThread.Enabled = false;
	}
}

PHP:
// die image.aspx Datei
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="image.aspx.cs" Inherits="image" %>

// die Code-Behind Datei von image.aspx
protected void Page_Load(object sender, EventArgs e) {
	ImageGenerator.ShowImage();
}

PHP:
public static void ShowImage() {
	byte[] receivedBytes = MyDataClass.GetData();

	MemoryStream ms = new MemoryStream(receivedBytes);

	HttpContext.Current.Response.Clear();
	HttpContext.Current.Response.ContentType = "image/jpeg";
		
	ms.WriteTo(HttpContext.Current.Response.OutputStream);
}


Der Timer ist zusammen mit dem imgBild (asp:Image) innerhalb eines UpdatePanels.

Vielleicht habt ihr ja Rat ;)
 
Hat den keiner eine Idee?

Für etwas Hilfe wäre ich sehr dankbar ;) :D
 
Moin. Erste Frage. Woher bezieht der WCF-Service das Bild? Zweite Frage. Sollen auch andere User sich an den Bilder bedienen können?
 
Der WCF Service holt das Bild von nem Desktop-Tool das ebenfalls einen WCF Service hostet.
Andere User sollen die Bilder nicht sehen, nur der gerade auf der Seite befindliche.

Ich häts gern so eingerichtet, dass andere User sich einen eigenen Service dann zu einem anderen PC starten können :)
 
Was ich nicht ganz kapiere. Warum muss alle 5ms eine Anfrage an den Service gemacht werden?
Das Bild ist noch nicht mal richtig fertig verarbeitet, da wird schon wieder ne Anfrage gestellt?!
 
Naja sagen wir es so... wenns z.B. ne Diashow wäre, dann wärs ja egal wie viel Zeit (User könnte sogar selbst wählen => 10 sec, 1 ms, 1 min.... )

Aber sagen wir mal ich will das z.B. für eine Präsentation oder sowas ähnliches verwenden. Dann muss der Desktop von dem Client möglichst zeitnah aktualisiert werden...

und hier hab ich dann natürlich das Problem, dass das Bild so gesehen "ruckelt" wenn die Anfragen im Millisekunden-Bereich liegen...
 
Hmm...ich würde es zwar anders lösen, aber das war ja nicht Deine Frage.
Aber warum lässt Du nicht das nächste Bild laden, wenn das aktuelle Bild fertig geladen wurde?
Welches das nächste Bild ist, kannst Du in der Response mitgeben.
 
Hmm... ok das mit dem Laden des neuen Bildes nach dem Fertigladen des aktuellen Pics klingt gar nicht so schlecht.
Muss nur noch überlegen wie ich das anstelle, weil momentan benutze ich ja einen Timer dafür...

Die andere Sache.... wie würdest du es am besten lösen? Ich bin gern für Vorschläge offen :D
Man lernt ja nie aus und der derzeitige Entwurf war nur mal so eine Idee die ich dann gleich mal versucht umzusetzen ;)
 
Eine Frage noch. Woher weiß der Service, welche Bilder geladen werden sollen? Oder liefert der Service eine Anzahl x?
 
Nja also bislang konzentriere ich mich auf die Darstellung vom Desktop... so zu sagen wie eine Präsentation.

Der User startet ein Desktop-Tool. Dieses erstellt einen WCF-Service.
Nun geh ich z.B. auf die ASP.NET Seite und logge mich ein, dann verbinde ich mich von dort aus zu dem WCF-Service den das Desktop-Tool des Users hostet.

Simples Prinzip eigentlich...

Der Service auf der Website ruft in einem Timer ständig die Funktion auf die mir das gerade aktuelle Bild vom Desktop liefert und zeigt es auf der Seite an... (bis hier her funktioniert es ja)....

Jetzt kommt das Problem, dass die Seite die Bilder nicht schnell genug nachladet (zumindestens wenn ich den Timer auf Millisekunden einstelle - will ja den Desktop in Echtzeit ansehen können), so dass eben dieses "ruckeln" entsteht (wenn man es überhaupt als ruckeln bezeichnen kann).
 
Moin.

Meine Ideen, ohne erstmal den Code zu loggen.

1.) Duplex-Binding

2.) Eine Abfrage holte alle Dateinamen als Array oder IEnumerable, die dann mit einer foreach-Schleife geholt werden.

3.) Abfrage 1 liefert gleich den Dateinamen der nächsten Datei mit. Wenn das Bild also fertig geladen wurde, wird die nächste geladen. Wir kein Pfad mehr geliefert, wurde das Ende erreicht.

Eventuell hilft auch folgendes Beispiel:
http://social.msdn.microsoft.com/Forums/en/wcf/thread/320a457d-9de1-4e72-8615-84d589f6d94a

EDIT:
4.) Alle Bilder auf den Rechner streamen lassen und dann mit jQuery / Ajax eine Slideshow einrichten.
 
Zuletzt bearbeitet:
Nja gut, aber das funktioniert für Ordner mit einer begrenzten Anzahl an Bildern... was ist aber z.B. mit meinem jetzigen Beispiel?

Ich weis ja nicht wie der nächste Screenshot aussieht und kann den ja nicht schon im vorherein holen, weil er erst erstellt wird,
sobald mein ASP.NET Service die Funktion zum Bildholen aufruft :P
 
Dann würde ich Punkt 1) bevorzugen

Die Punkte sind 4 Vorschläge, nicht die Reihenfolge. Beim Duplex-Binding werden die "Rollen" getauscht.
D.h der Service (jetzt Client) sendet an den Server (Deine ASP.Net Anwendung), wenn ein Bild fertig gestellt wurde.

Die Vorschläge an sich sollen Dir aber zu denken geben, dass Du vielleicht Dein Szenario überdenken solltest, und ggf. anpasst.
 
Hmm... ja Duplex klingt eventuell nicht schlecht, aber muss echt mal überlegen wie ich die Idee dann weiterspinne :D

Vielen Dank schon mal für den Denkanstoß und die Hilfestellung.
Wenn was ist, dann meld ich mich wieder ;-)
 
Zurück
Oben