2012-04-15 7 views
2

Ich habe einen ziemlich einfachen Dienst implementiert, der die Dateiübertragungen von meinen Clients auf den Server behandelt, ist das Problem, wenn ein Client eine Dateianforderung sendet. Die gesamte Bandbreite wird diesem einzelnen Client zugewiesen und andere müssen warten, bis die angeforderte Dateiübertragung abgeschlossen ist. Also meine Frage ist, wie der Dienst effizienter zu machen und lassen Sie die BenutzerConcurrency Management in WCF

[ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode =InstanceContextMode.PerCall, 
    ConcurrencyMode=ConcurrencyMode.Multiple)] 

ich die Bandbreite teilen sich die InstanceContextMode Attribut PerCall gesetzt, aber das war der Trick

UPDATE nicht tun: Diese Project ist ähnlich wie meine http://www.codeproject.com/Articles/33825/WCF-TCP-based-File-Server

Antwort

4

Es ist fraglich, ob es wünschenswert ist, Dateien über einen WCF-Endpunkt bereitzustellen. Die Gründe dafür sind ziemlich genau die Probleme, die Sie hatten. Es funktioniert für einige Clients gleichzeitig - aber das Skalieren erfordert das Hosten neuer Instanzen des Service hinter einem Load Balancer.

Es wäre eine Überlegung wert, Ihre Dateien mit einer Art von Speicherdienst zu hosten und Ihren WCF-Dienst einfach einen Link oder ein Handle zu der Datei zurückgeben zu lassen. Dann kann die Datei offline abgerufen werden. Microsoft hat Azure Blob Storage für diesen genauen Zweck erstellt.

Schätzen Sie dies nicht Ihre ursprüngliche Frage, und verstehen Sie den Umfang Ihrer Anforderung möglicherweise nicht eine große Überarbeitung unterzubringen.

+0

Vielen Dank @hugh, ich habe nicht die Zeit, um das System in dieser Phase des Projekts zu ändern, aber wenn ich vorhaben, die Dateiverwaltung zu ändern System was ist dein Vorschlag? Ich denke über FTP-Server: -? – Andy

+0

FTP ist roh, aber effektiv. Um ehrlich zu sein, habe ich File Sharing nicht so implementiert. Wir hosten unsere Dienste auf Azure und sind mir daher der Blob-Speicher-Strategie bewusst. –

5

WCF hat keine ordnungsgemäße Lastverteilung, Sie müssen eine selbst entwickeln. Wenn Sie Dateien übertragen, nehmen wir an, Download, sollten Sie Pakete von Daten anstelle der gesamten Datei auf einmal senden. Wenn Sie dies tun, fügen Sie dem Prozess Verzögerungen/Wartezeiten hinzu, um die Anzahl der Bytes zu begrenzen, die der Server in jedem Zeitfenster sendet. Dadurch wird Platz für andere Anfragen geschaffen.

+1

Ich erwartete eine viel einfachere Lösung ... aber trotzdem danke – Andy

1

Eine weitere Option ist die Verwendung des Chunking-Kanals, wenn Sie große Dateien übertragen. Beispiele: MSDN, codeplex.

Obwohl ich @hugh Position stimme.