2015-09-30 26 views
13

Tôi đang sử dụng RestSharp (phiên bản 105.2.3.0 trong Visual Studio 2013, .net 4.5) để gọi một dịch vụ web được lưu trữ trên NodeJS. Một trong những cuộc gọi tôi cần thực hiện là tải tệp lên. Sử dụng một yêu cầu RESTSharp, nếu tôi lấy luồng từ đầu của tôi vào một mảng byte và chuyển nó tới AddFile, nó hoạt động tốt. Tuy nhiên, tôi sẽ khá nhiều dòng nội dung và không tải lên toàn bộ các tập tin trong bộ nhớ máy chủ (các tập tin có thể là 100 của MB).RestSharp AddFile Sử dụng Stream

Nếu tôi thiết lập Hành động sao chép luồng của mình (xem bên dưới), tôi nhận được ngoại lệ tại dòng "MyStream.CopyTo" của System.Net.ProtocolViolationException (Byte được ghi vào luồng vượt quá Độ dài nội dung kích thước byte được chỉ định). Ngoại lệ này được ném vào bên trong khối Hành động sau khi client.Execute được gọi.

Từ nội dung tôi đọc, tôi không nên thêm tiêu đề Content-Length theo cách thủ công và không giúp ích gì nếu tôi làm. Tôi đã thử thiết lập bộ đệm CopyTo thành các giá trị nhỏ và lớn, như wel như bỏ qua nó hoàn toàn, vô ích. Ai đó có thể cho tôi một gợi ý về những gì tôi đã bỏ lỡ?

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

Tôi vừa phát hiện ra cùng một vấn đề. Dòng của tôi 'request.AddFile (" tệp ", stream => data.CopyTo (stream), fileName)' đã bị hỏng với phiên bản RestSharp 105.2.0+. Khi hạ cấp xuống 105.1.0, nó hoạt động tốt. Chưa có thời gian để điều tra những thay đổi trong git-repo ... – anve

+0

Tôi cũng gặp vấn đề này. Hạ cấp xuống 105.1.0 đã giúp, nhưng tôi cũng đã thêm một nhận xét cho [vấn đề cũ trên github] (https://github.com/restsharp/RestSharp/issues/70) – Dmitry

+0

Bạn có thể sử dụng AddFileBytes là một số loại trình bao bọc – hpfs

Trả lời

6

Tôi gặp vấn đề tương tự. Tôi đã kết thúc bằng cách sử dụng .Add() trên bộ sưu tập tệp. Nó có tham số FileParameter có cùng thông số như AddFile(), bạn chỉ cần thêm 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 
});    
Các vấn đề liên quan