2015-09-30 24 views
13

NodeJS tarafından barındırılan bir web hizmetini çağırmak için RestSharp (Visual Studio 2013, .net 4.5 sürümü 105.2.3.0) kullanıyorum. Yapmam gereken çağrılardan biri bir dosya yüklemek. Bir RESTSharp isteği kullanarak, akışımı sondan bir bayt dizisine alıp AddFile'a aktarırsam, düzgün çalışır. Bununla birlikte, içeriği daha çok akışa geçirip sunucu belleğinde tüm dosyaları yüklememeyi tercih ederim (dosyalar 100 MB olabilir).RestSharp AddFile Akışını Kullanma

Akışımı kopyalamak için bir Eylem kurduysam (aşağıya bakın), System.Net.ProtocolViolationException "MyStream.CopyTo" satırında bir istisna alıyorum (Akışa yazılacak bayt İçerik Uzunluğunu aştı) bayt boyutu belirtildi). Bu istisna, client.Execute çağrıldıktan sonra Action bloğuyla atılır.

Okuduğum kadarıyla, bir Content-Length üstbilgisini el ile eklememeliyim ve yapmam durumunda yardımcı olmaz. CopyTo arabellekini küçük ve büyük değerlere ayarlamayı denemekteyim, tamamen boş bırakmayacak kadar iyi değil, boşuna. Birisi bana neyi özlediğime dair ipucu verebilir mi?

// 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

Eklemek zorundayım, aynı sorunu daha yeni keşfettim. Benim satır 'request.AddFile (" dosya ", stream => data.CopyTo (akış), dosyaAdı)' RestSharp sürüm 105.2.0+ ile kırıldı. 105.1.0'a düşürüldüğünde, iyi çalışır. Git-repo'daki değişiklikleri araştırmak için zamanım olmadı ... – anve

+0

Bu problemi de yaşıyorum. 105.1.0'a düşürme yardımcı oldu, ancak aynı zamanda eski [github'daki sorun] 'a bir yorum ekledim (https://github.com/restsharp/RestSharp/issues/70) – Dmitry

+0

AddFileBytes'i kullanabilirsiniz. – hpfs

cevap

6

Aynı sorunu yaşadım. Dosyalar koleksiyonunda .Add() kullanarak bitti. AddFile() ile aynı parametrelere sahip bir FileParameter paramına sahiptir, sadece ContentLength:

var req = GetRestRequest("Upload", Method.POST, null); 
//req.AddFile("file", 
// (s) => { 
//  var stream = input(imageObject); 
//  stream.CopyTo(s); 
//  stream.Dispose(); 
// }, 
// fileName, contentType); 

req.Files.Add(new FileParameter { 
    Name = "file", 
    Writer = (s) => { 
     var stream = input(imageObject); 
     stream.CopyTo(s); 
     stream.Dispose(); 
    }, 
    FileName = fileName, 
    ContentType = contentType, 
    ContentLength = contentLength 
});    
İlgili konular