Frage

Ich habe eine kleine Anwendung geschrieben, die Menschen laden und Download von Dateien zu mir lassen. Ich habe einen Web-Service zu diesem applciation hinzugefügt, um den Upload / Download-Funktionalität, die Art und Weise zur Verfügung zu stellen, aber ich bin mir nicht sicher, wie gut meine Implementierung mit großen Dateien bewältigen wird.

Im Moment sind die Definitionen der Upload und Download-Methoden wie folgt aussehen (geschrieben mit Apache CXF):

boolean uploadFile(@WebParam(name = "username") String username,
    @WebParam(name = "password") String password,
    @WebParam(name = "filename") String filename,
    @WebParam(name = "fileContents") byte[] fileContents)
    throws UploadException, LoginException;

byte[] downloadFile(@WebParam(name = "username") String username,
    @WebParam(name = "password") String password,
    @WebParam(name = "filename") String filename) throws DownloadException,
    LoginException;

So die Datei hochgeladen wird und als Byte-Array heruntergeladen. Aber wenn ich eine Datei von irgendeinem dummen Größe haben (zum Beispiel 1 GB) wird sicherlich versuchen, diese und setzen all diese Informationen in den Speicher und zum Absturz bringen meinen Dienst.

Also meine Frage ist - ist es möglich, stattdessen eine Art von Strom zurück? Ich könnte mir vorstellen, dies wird nicht schrecklich OS obwohl unabhängig sein. Obwohl ich die Theorie, die hinter Web-Service weiß, ist die praktische Seite etwas, das ich brauche noch ein paar Informationen zu holen.

Prost für jede Eingabe, Lee

War es hilfreich?

Lösung

Stephen Denne hat eine Metro-Implementierung, die Ihre Anforderung erfüllt. Meine Antwort ist vorgesehen, unten nach kurzer explination, warum das der Fall ist.

Die meisten Web-Service-Implementierungen, die unter Verwendung von HTTP als Message-Protokoll aufgebaut werden, sind REST-konform, dass sie nur einfaches allow-Sendeempfangsmuster und nichts mehr. Diese stark verbessert die Interoperabilität, da alle verschiedenen Plattformen diese einfache Architektur (zu einem .NET Web-Service spricht zum Beispiel eines Java-Web-Service) verstehen.

Wenn Sie diese erhalten wollen könnten Sie bieten Chunking.

boolean uploadFile(String username, String password, String fileName, int currentChunk, int totalChunks, byte[] chunk);

Dies würde einige Fußarbeit in Fällen verlangen, wenn Sie nicht über die Stücke in der richtigen Reihenfolge bekommen (Oder Sie können einfach die Stücke in der richtigen Reihenfolge kommen erfordern), aber es wäre wahrscheinlich ziemlich einfach zu implementieren sein.

Andere Tipps

Ja, ist es möglich, mit U-Bahn. Sehen Sie sich die Große Attachments Beispiel, das aussieht wie es das tut, was Sie wollen .

  

JAX-WS RI bietet Unterstützung für das Senden und Empfangen von großen Anlagen in einer Streaming-Mode.

     
      
  • Verwenden Sie MTOM und Datahandler im Programmiermodell.
  •   
  • die Datahandler zu StreamingDataHandler Cast und seine Methoden.
  •   
  • Stellen Sie sicher, dass Sie rufen StreamingDataHandler.close () und schließen auch die StreamingDataHandler.readOnce (Strom).
  •   
  • Aktivieren HTTP auf der Client-Seite Chunking.
  •   

Wenn Sie einen standardisierten Web-Service der Sender und Empfänger kann auf die Integrität der XML verlassen Daten vom einen zum anderen zu senden. Dies bedeutet, dass eine Web-Service-Anfrage und Antwort nur vollständig ist, wenn der letzte Tag gesendet wurde. Mit diesem Hintergrund kann ein Web-Service nicht als Strom behandelt werden.

Dies ist logisch, weil standardisierter Web-Service auf dem http-Protokoll verlasse. Das ist „staatenlos“, wird sagen, es ist wie funktioniert „offene Verbindung ... Anfrage senden ... Empfangen von Daten ... schließen Anfrage“. Die Verbindung wird am Ende geschlossen werden, sowieso. So etwas wie Streaming ist nicht beabsichtigt, hier verwendet werden. Oder er Schichten über http (wie Web-Services).

So sorry, aber so weit ich für das Streaming in Web-Service gibt es keine Möglichkeit zu sehen. Noch schlimmer:. Je nach Implementierung / Konfiguration eines Web-Service, byte [] - Daten Base64 übersetzt werden können und nicht den CDATA-Tag und die Anforderung könnte noch mehr aufgebläht bekommen

P. S .: Yup, wie andere schrieb: "chuinking" möglich. Aber das ist kein Streaming als solche ;-) -. Wie auch immer, kann es Ihnen helfen,

Ich hasse es zu brechen, um diejenigen, die ein Streaming-Web-Service denken nicht möglich ist, aber in Wirklichkeit alle HTTP-Anfragen sind Strom basiert. Jeder Browser eine GET auf eine Website zu tun ist Strom basiert. Jeder Aufruf der Webservice-Stream basiert. Ja alle. Wir bemerken nicht, dies auf der Ebene, wo wir Dienste oder Seiten implementieren, weil unteren Ebenen der Architektur mit diesem für Sie es zu tun -. Aber es wird getan,

Haben Sie schon einmal in einem Browser bemerkt, dass manchmal kann es eine Weile dauern, um eine Seite zu holen - der Browser hält nur die Sanduhr zeigt Ankurbeln weg? Das liegt daran, dass der Browser auf einem Strom wartet.

Streams ist der Grund, mimt / Typ vor den eigentlichen Daten gesendet werden muß - es ist alles nur ein Byte-Stream an den Browser, wäre es nicht in der Lage sein, ein Foto zu identifizieren, wenn Sie ihm nicht sagen, was es ist zuerst . Es ist auch, warum Sie die Größe eines binären passieren müssen vor dem Senden -. Der Browser nicht in der Lage sein zu sagen, wo das Bild aufhört und die Seite wieder anzieht

Es ist alles nur ein Strom von Bytes an den Client. Wenn Sie diese für sich selbst beweisen wollen, nur um ein Halten des Ausgangsstroms an jedem beliebigen Punkt in der Bearbeitung einer Anfrage und close () es. Sie sprengen alles. Der Browser wird sofort die Sanduhr nicht mehr angezeigt werden, und wird eine „nicht finden“ oder „Verbindung zurückgesetzt auf Server“ oder eine andere solche Meldung angezeigt wird.

Das ist eine Menge Leute wissen nicht, dass all dieses Zeug Strom basiert, zeigt, wie viel Zeug hat oben drauf geschichtet worden. Einige würden sagen, zu viel Zeug. - Ich bin einer von denen

Viel Glück und glücklich Entwicklung - entspannen jene Schultern

Für WCF denke ich sein kann ein Mitglied auf einer Nachricht als Strom definieren und die Bindung entsprechend -. Ich habe diese Arbeit gesehen mit wcf im Gespräch mit Java Web Service

Sie müssen den transfer = „StreamedResponse“ in der Httptransport-Konfiguration einzustellen und verwenden mtomMessageEncoding (benötigen Sie einen benutzerdefinierten Bindungsabschnitt in der Konfiguration verwendet werden).

Ich denke, eine Einschränkung ist, dass Sie nur eine einzige Nachricht Körperteil haben können, wenn Sie streamen möchten (welche Art von Sinn macht).

Apache CXF unterstützt das Senden und Empfangen von Streams.

Eine Möglichkeit, es zu tun, ist eine uploadFileChunk (byte [] chunkData, int size, int offset, int Totalsize) hinzuzufügen Methode (oder so ähnlich), dass Uploads Teile der Datei und die Server schreibt es das auf der Festplatte.

Beachten Sie, dass eine Web-Service-Anforderung im Grunde auf einen einzelnen HTTP-POST läuft darauf hinaus.

Wenn Sie am Ausgang einer ASMX-Datei in .NET aus, es zeigt Ihnen genau, was die POST-Anfrage und Antwort aussehen werden.

Chunking, wie @Guvante erwähnt, wird die nächste Sache sein, was Sie wollen.

Ich nehme an, Sie Ihren eigenen Web-Client-Code implementieren könnten die TCP / IP und Streaming Dinge in Ihre Anwendung zu behandeln, aber das wäre komplex, gelinde gesagt.

Ich denke, mit einem einfachen Servlet für diese Aufgabe viel einfacher Ansatz wäre, oder gibt es keinen Grund Sie nicht ein Servlet verwenden kann?

Zum Beispiel könnten Sie die Commons Open-Source-Bibliothek.

Die RMIIO Bibliothek für Java bietet eine RemoteInputStream über RMI für das Austeilen - wir nur RMI benötigt, obwohl sollten Sie in der Lage sein, den Code anzupassen gegenüber anderen Arten von RMI zu arbeiten. Dies können Sie behilflich sein - vor allem, wenn Sie eine kleine Anwendung auf der Benutzerseite haben können. Die Bibliothek wurde mit dem ausdrücklichen Ziel, entwickelt in der Lage, die Größe der Daten zu begrenzen geschoben auf den Server genau die Art von Situation zu vermeiden, die Sie beschreiben, -. Effektiv einen DoS-Angriff durch RAM oder Festplatte füllt

Mit der RMIIO Bibliothek, die Server-Seite wird, um zu entscheiden, wie viele Daten es bereit ist, zu ziehen, wo mit HTTP PUT und POSTs, bekommt der Kunde diese Entscheidung zu treffen, einschließlich der Geschwindigkeit, mit der es drückt.

Ja, ein Webservice kann Streaming tun. Ich habe einen Webservice mit Apache Axis2 und MTOM Rendern von PDF-Dokumenten aus XML zu unterstützen. Da die resultierenden Dateien recht groß sein könnten, Streaming war wichtig, weil wir nicht alles in Erinnerung behalten wollten. Werfen Sie einen Blick auf die Oracle-Dokumentation auf Streaming-SOAP-Anhänge.

Alternativ können Sie es selbst tun, und Kater werden die Chunked Header erstellen. Dies ist ein Beispiel eines Federreglerfunktion, die Streams.

 @RequestMapping(value = "/stream")
        public void hellostreamer(HttpServletRequest request, HttpServletResponse response) throws CopyStreamException, IOException  
{

            response.setContentType("text/xml");
            OutputStreamWriter writer = new OutputStreamWriter (response.getOutputStream());
            writer.write("this is streaming");
            writer.close();

    }

Es ist eigentlich gar nicht so schwer, „die TCP / IP verarbeiten und streamen Dinge in Ihre Anwendung“. Versuchen Sie, diese ...

class MyServlet extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        response.getOutputStream().println("Hello World!");
    }
}

Und das ist alles dort ist zu ihm. Sie haben in dem obigen Code, reagiert auf eine Anfrage HTTP GET von einem Browser gesendet und kehrte um den Text zu diesem Browser „Hallo Welt!“.

Beachten Sie, dass „Hallo Welt!“ nicht gültig HTML, also mit einem Fehler auf dem Browser am Ende Sie können, aber das ist wirklich alles, um es dort ist.

Good Luck in Ihrer Entwicklung!

Rodney

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top