Announcement

Collapse
No announcement yet.

Hochladen von zwei XML Dokumenten mittels HttpWebRequest und Multipart Request

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hochladen von zwei XML Dokumenten mittels HttpWebRequest und Multipart Request

    Hallo!

    Ich habe folgendes Problem:

    Für eine Anfrage an ein Framework muss ich einen MultipartRequest mit 2 Dateien senden.
    Die erste Datei ist ein XML Dokument dass ich als XDokument in dem Programm erstelle und das verschiedene Parameter für die Verarbeitung enthält.
    Die zweite Datei ist ein XML Dokument, das für die Berechnung der Antwort benötigt wird.

    Ich habe versucht, mir einen solchen MultipartRequest zusammenzubauen, nach Beispielen die ich im Internet gefunden habe. Leider habe ich kein Beispiel für das Senden von mehreren Dateien gefunden.

    Im Moment bekomme ich beim zweiten Durchlauf der Whileschleife beim schreiben der Datei aus dem GraphStream in den RequestStream eine Exception (System.Net.Sockets.SocketException wurde nicht behandelt.
    Message="Eine vorhandene Verbindung wurde vom Remotehost geschlossen")
    (ich markiere die Stelle noch im Code).

    Kann mir jemand sagen ob die Vorgehensweise so richtig ist und warum ich diese Fehlermeldung bekomme?

    Code:
    HttpWebRequest HttpRequest =
                            (HttpWebRequest)HttpWebRequest.Create(_RoutingFrameworkURL);
                    
                    string Boundary = "----------" + DateTime.Now.Ticks.ToString("x");
    
                    HttpRequest.ContentType = string.Format("multipart/form-data;boundary={0}", Boundary);
                    HttpRequest.Method = "POST";
    
                    HttpRequest.KeepAlive = true;
    
                    HttpRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
    
                    // Get the boundry in bytes
                    byte[] BoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + Boundary + "\r\n");
    
                    // Get the header for the file upload
    //Was für einen Content Type muss ich hier verwenden? Ich will wie gesagt gern zwei XML Dateien hochladen
                    string HeaderTemplate = "Content-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";
    
                    // Add the first filename to the header
                    StringBuilder Header = new StringBuilder();
                    Header.Append(Boundary);
    Hier habe ich auch eine Frage: Ich habe das Dokument in diesem Falle nicht extra in eine Datei geschrieben. Was mus sich als dritte Variable beim string.Format angeben?
                    Header.Append(string.Format(HeaderTemplate, "xmlFile", _doc));
    
                    // Add the second filename to the header
    Muss nach der ersten Datei eine Boundary hinzugefügt werden?
                    Header.Append(Boundary);
                    Header.Append(string.Format(HeaderTemplate, "xmlGraphFile", _XmlPathGraph));
    
                    //convert the header to a byte array
                    byte[] Headerbytes = System.Text.Encoding.UTF8.GetBytes(Header.ToString());
    
                    //convert first document to byte array
                    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
                    byte[] docInByte = enc.GetBytes(_doc.ToString());
    
                    //open Filestream for Graphdocument
                    FileStream GraphStream = new FileStream(_XmlPathGraph, FileMode.Open, FileAccess.Read);
    
                    HttpRequest.ContentLength = docInByte.Length + (int)GraphStream.Length + Headerbytes.Length + BoundaryBytes.Length + 2;
    
                    //get output stream
                    Stream RequestStream = HttpRequest.GetRequestStream();
    
                    // Write the header including the filename.
                    RequestStream.Write(Headerbytes, 0, Headerbytes.Length);
    
                    //write the first document (requestdocument)
                    RequestStream.Write(docInByte, 0, docInByte.Length);
    
                    //write Boundary to separate the 2 documents??
                    RequestStream.Write(BoundaryBytes, 0, BoundaryBytes.Length);
    
                    // Use 4096 for the buffer
                    byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)GraphStream.Length))]; ;
    
                    int bytesRead = 0;
    Das ist die While Schleife, die die Socket Exceptin wirft. Beim ersten mal läuft sie aber ohne Fehlermeldung durch.
                    // Loop through whole file uploading parts in a stream.
                    while ((bytesRead = GraphStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        RequestStream.Write(buffer, 0, bytesRead);
                    }
    
    
                    BoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + Boundary + "--\r\n");
    
    
                    // Write out the trailing boundry
                    RequestStream.Write(BoundaryBytes, 0, BoundaryBytes.Length);
    
                    // Close the request and file stream
                    RequestStream.Close();
                    GraphStream.Close();
    
                    HttpWebResponse HttpResponse =
                        (HttpWebResponse)HttpRequest.GetResponse();
    
                    Stream ResponseStream = HttpResponse.GetResponseStream();
    
    
                    StreamReader ResponseReader = new StreamReader(ResponseStream);
    
                    string ResponseString = ResponseReader.ReadToEnd();
    
                    Cursor.Current = Cursors.Default;
                    HttpResponse.Close();
                    ResponseStream.Close();
    Ich hoffe sehr, dass mir jemand weiterhelfen kann. Ich weiß einfach nicht, wo der Fehler liegt.

  • #2
    Hey!

    Ich habe keine Ahnung, warum dieser Beitrag zweimal (http://entwickler-forum.de/showthread.php?t=53246) hier rein gekommen ist.

    Vielleicht habe ich einmal aus versehen auf Aktualisieren geklickt oder sowas??

    Jedenfalls war das keine Absicht.

    Könnte mir trotzdem jemand behilflich sein?

    Und könnte vielleicht jemand den zweiten Beitrag löschen?

    Comment

    Working...
    X