在 RestSharp 中限制下载大小
Limit download size in RestSharp
我们正在使用 RestSharp v105.2.3。
有没有办法在收到 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);
}
}
我相信有办法,但是您失去了 RestResponse
提取数据并自动反序列化的能力。我相信用例更多的是从云中提取 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.
ResponseWriter
属性 是一个 Action<Stream>
回调。读取 HTTP 响应的代码要么调用 ResponseWriter
(如果提供),要么一次读取所有字节并填充 Response.RawBytes
属性.
您必须选择您想要的行为。
我们正在使用 RestSharp v105.2.3。
有没有办法在收到 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);
}
}
我相信有办法,但是您失去了 RestResponse
提取数据并自动反序列化的能力。我相信用例更多的是从云中提取 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.
ResponseWriter
属性 是一个 Action<Stream>
回调。读取 HTTP 响应的代码要么调用 ResponseWriter
(如果提供),要么一次读取所有字节并填充 Response.RawBytes
属性.
您必须选择您想要的行为。