2015-09-30 5 views
13

Ich verwende RestSharp (Version 105.2.3.0 in Visual Studio 2013, .net 4.5), um einen von NodeJS gehosteten Webservice aufzurufen. Einer der Anrufe, die ich machen muss, ist eine Datei hochzuladen. Wenn ich eine RESTSharp-Anforderung verwende, wenn ich den Datenstrom von meinem Ende in ein Byte-Array abrufe und dieses an AddFile übergebe, funktioniert es einwandfrei. Allerdings würde ich viel lieber den Inhalt streamen und nicht ganze Dateien im Serverspeicher laden (die Dateien können 100er MB sein).RestSharp AddFile mit Stream

Wenn ich eine Aktion zum Kopieren meines Streams eingerichtet habe (siehe unten), erhalte ich eine Ausnahme in der Zeile "MyStream.CopyTo" von System.Net.ProtocolViolationException (Bytes, die in den Stream geschrieben werden sollen, überschreiten die Content-Length Bytes Größe angegeben). Diese Ausnahme wird in den Action-Block geworfen, nachdem client.Execute aufgerufen wurde.

Von dem, was ich gelesen habe, sollte ich nicht manuell einen Content-Length-Header hinzufügen, und es hilft nicht, wenn ich es tue. Ich habe versucht, CopyTo Puffer auf kleine und große Werte zu setzen, wie auch ganz weglassen, ohne Erfolg. Kann mir jemand einen Hinweis geben, was ich verpasst habe?

// Snippet... 
    protected T PostFile<T>(string Resource, string FieldName, string FileName, 
     string ContentType, Stream MyStream, 
     IEnumerable<Parameter> Parameters = null) where T : new() 
    { 
     RestRequest request = new RestRequest(Resource); 
     request.Method = Method.POST; 

     if (Parameters != null) 
     { 
      // Note: parameters are all UrlSegment values 
      request.Parameters.AddRange(Parameters); 
     } 

     // _url, _username and _password are defined configuration variables 
     RestClient client = new RestClient(_url); 
     if (!string.IsNullOrEmpty(_username)) 
     { 
      client.Authenticator = new HttpBasicAuthenticator(_username, _password); 
     } 

     /* 
     // Does not work, throws System.Net.ProtocolViolationException, 
     // Bytes to be written to the stream exceed the 
     // Content-Length bytes size specified. 
     request.AddFile(FieldName, (s) => 
     { 
      MyStream.CopyTo(s); 
      MyStream.Flush(); 
     }, FileName, ContentType); 
     */ 

     // This works, but has to load the whole file in memory 
     byte[] data = new byte[MyStream.Length]; 
     MyStream.Read(data, 0, (int) MyStream.Length); 
     request.AddFile(FieldName, data, FileName, ContentType); 

     var response = client.Execute<T>(request); 

     // check response and continue... 
    } 
+1

Ich habe gerade das gleiche Problem entdeckt. Meine Zeile 'request.AddFile (" Datei ", stream => data.CopyTo (stream), Dateiname) wurde mit RestSharp Version 105.2.0+ gebrochen. Beim Downgrade auf 105.1.0 funktioniert es einwandfrei. Habe noch nicht die Zeit gehabt, die Änderungen im Git-Repo zu untersuchen ... – anve

+0

Ich habe dieses Problem auch. Downgrade auf 105.1.0 half, aber ich fügte auch einen Kommentar zu alten [Problem auf GitHub] (https://github.com/restsharp/RestSharp/issues/70) – Dmitry

+0

Sie können AddFileBytes ist eine Art Wrapper – hpfs

Antwort

6

Ich hatte das gleiche Problem. Am Ende habe ich die .Add() in der Dateisammlung verwendet. Es hat einen FileParameter-Parameter, der die gleichen Parameter wie AddFile() hat, Sie müssen nur die ContentLength hinzufügen: