2016-05-19 48 views
1

我们正在使用RestSharp v105.2.3。限制在RestSharp中下载大小

有没有办法在接收到N个字节后停止接收响应,其中N是我可以控制的参数?


编辑:这是我的完整解决方案,基于Berin的答案。

public static class IRestClientExtensions 
{ 
    public static IRestResponse Execute(this IRestClient client, IRestRequest request, byte[] buffer, out int bufferSize) 
    { 
     var totalBytesRead = 0; 

     request.ResponseWriter = stream => 
     { 
      while (totalBytesRead < buffer.Length) 
      { 
       var bytesRead = stream.Read(buffer, totalBytesRead, buffer.Length - totalBytesRead); 
       if (bytesRead == 0) 
       { 
        break; 
       } 

       totalBytesRead += bytesRead; 
      } 
     }; 

     var response = client.Execute(request); 

     bufferSize = totalBytesRead; 
     return response; 
    } 
} 

单元测试(使用NUnit):

[TestFixture] 
public class IRestClientExtensionsTests 
{ 
    [Test, Explicit] 
    public void Execute_OutputBufferTooSmall() 
    { 
     var client = new RestClient("https://www.w3.org/TR/html4/charset.html"); 
     var request = new RestRequest(); 

     var buffer = new byte[4 * 1024]; 
     int bufferSize; 
     var response = client.Execute(request, buffer, out bufferSize); 

     Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
     Assert.IsTrue(string.IsNullOrEmpty(response.Content)); 
     Assert.AreEqual(buffer.Length, bufferSize); 
    } 

    [Test, Explicit] 
    public void Execute_OutputBufferLargeEnough() 
    { 
     var client = new RestClient("https://www.w3.org/TR/html4/charset.html"); 
     var request = new RestRequest(); 

     var buffer = new byte[256 * 1024]; 
     int bufferSize; 
     var response = client.Execute(request, buffer, out bufferSize); 

     Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); 
     Assert.IsTrue(string.IsNullOrEmpty(response.Content)); 
     Assert.IsTrue(bufferSize < buffer.Length); 
    } 
} 

回答

2

我相信有一种方法,但你失去了RestResponse的拉动数据,并自动反序列化的能力。我认为使用情况更是从云拉动斑点:

var client = new RestClient("http://example.com"); 
var request = new RestRequest("resource/{id}", Method.POST); 

request.ResponseWriter = (stream) => { 
    // work with the writer you recieve here. 
    // This is an Action<Stream> callback 
}; 

// NOTE: the callback is invoked during this statement: 
IRestResponse response = client.Execute(request); 

// The response has all the meta information, but none of the data. 

ResponseWriter属性是一个Action<Stream>回调。读取HTTP响应的代码或者在提供时调用ResponseWriter,或者它一次读取所有字节并填充Response.RawBytes属性。

你必须选择你想要的行为。