C# 限制RestSharp中的下载大小

C# 限制RestSharp中的下载大小,c#,restsharp,C#,Restsharp,我们正在使用RestSharp v105.2.3 是否有一种方法可以在收到N个字节后停止接收响应,其中N是我可以控制的参数 编辑:下面是我根据贝林的答案给出的完整解决方案 public static class IRestClientExtensions { public static IRestResponse Execute(this IRestClient client, IRestRequest request, byte[] buffer, out int bufferSiz

我们正在使用RestSharp v105.2.3

是否有一种方法可以在收到N个字节后停止接收响应,其中N是我可以控制的参数


编辑:下面是我根据贝林的答案给出的完整解决方案

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;
    }
}
公共静态类IRestClientExtensions
{
公共静态IRestResponse执行(此IRestClient客户端,IRestRequest请求,字节[]缓冲区,out int bufferSize)
{
var totalBytesRead=0;
request.ResponseWriter=stream=>
{
while(totalBytesRead
单元测试(使用NUnit):

[TestFixture]
公共类IRestClientExtensionsTests
{
[测试,明确]
public void Execute_OutputBufferTooSmall()
{
var client=新的RestClient(“https://www.w3.org/TR/html4/charset.html");
var request=new RestRequest();
var buffer=新字节[4*1024];
int缓冲区大小;
var response=client.Execute(请求、缓冲区、输出缓冲区大小);
AreEqual(HttpStatusCode.OK,response.StatusCode);
IsTrue(string.IsNullOrEmpty(response.Content));
Assert.AreEqual(buffer.Length,bufferSize);
}
[测试,明确]
public void Execute_OutputBufferLargeEnough()
{
var client=新的RestClient(“https://www.w3.org/TR/html4/charset.html");
var request=new RestRequest();
var buffer=新字节[256*1024];
int缓冲区大小;
var response=client.Execute(请求、缓冲区、输出缓冲区大小);
AreEqual(HttpStatusCode.OK,response.StatusCode);
IsTrue(string.IsNullOrEmpty(response.Content));
IsTrue(bufferSize
我相信有一种方法,但是您失去了
Response
自动提取数据并反序列化数据的能力。我相信这个用例更适合于从云中提取blob:

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.
var client=new RestClient(“http://example.com");
var request=new RestRequest(“resource/{id}”,Method.POST);
request.ResponseWriter=(流)=>{
//与你在这里收到的作者合作。
//这是一个动作回调
};
//注意:在此语句期间调用回调:
IRestResponse response=client.Execute(请求);
//响应包含所有元信息,但没有任何数据。
ResponseWriter
属性是一个
Action
回调。读取HTTP响应的代码要么调用
ResponseWriter
(如果提供),要么一次读取所有字节并填充
response.RawBytes
属性

你必须选择你想要的行为

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.