Я использую RestSharp (версия 105.2.3.0 в Visual Studio 2013,.net 4.5) для вызова веб-службы, размещенной в NodeJS. Один из вызовов, который мне нужно сделать, - загрузить файл. Используя запрос RESTSharp, если я получаю поток с моего конца в массив байтов и передаю его в AddFile, он отлично работает. Тем не менее, я бы скорее потоком содержимого и не загружать целые файлы в память сервера (файлы могут быть 100 МБ).
Если я настрою действие для копирования моего потока (см. ниже), я получаю исключение в строке "MyStream.CopyTo" System.Net.ProtocolViolationException(байты, которые будут записаны в поток, превышают байты Content-Length размер указан). Это исключение выбрано внутри блока Action после client.Execute вызывается.
Из того, что я читал, я не должен вручную добавлять заголовок Content-Length, и это не помогает, если я это делаю. Я попытался настроить буфер CopyTo на малые и большие значения, так же как и исключить его полностью, безрезультатно. Может кто-нибудь дать мне подсказку о том, что я пропустил?
// 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...
}