Метод C# RestSharp PUT и отправка необработанных байтов (protobuf)

Как отправить массив байтов с помощью метода HTTP PUT? Метод AddFile класса RestRequest отправляет дополнительные заголовки. Метод AddParameter принимает тип Object.

Как я это делаю:

byte[] data;
using (var ms = new MemoryStream())
{
    Serializer.Serialize(ms, query);
    data = ms.ToArray();
    ms.Close();
}
var client = new RestClient(ServerPath);
var request = new RestRequest(RequestPath, Method.PUT);
request.AddFile("stream", x => new MemoryStream(data), string.Empty);
client.ExecuteAsync(request, responce => Debug.WriteLine(responce.Content));

Но на стороне сервера я вижу дополнительные заголовки

-------------------------------28947758029299 Content-Disposition: form-data; имя="поток"; filename="" Content-Type: application/octet-stream [НЕОБРАБОТАННЫЕ ДАННЫЕ ЗДЕСЬ] -------------------------------28947758029299 --

Дополнительные заголовки делают запрос нечитаемым. Что я делаю неправильно?


person NikedLab    schedule 25.02.2013    source источник
comment
Как сервер ожидает, что это будет выглядеть? должна ли полезная нагрузка быть просто необработанным телом? использование AddFile предполагает, что на самом деле ожидается multi-part , но это не соответствует указанному типу/расположению контента. Например, это так же просто, как WebClient с client.UploadData(address, "PUT", data); ?   -  person Marc Gravell    schedule 25.02.2013
comment
Сервер ожидает только необработанные данные, без заголовков. Если я использую сервер request.AddObject(data), вижу его как Length=29&Rank=1&SyncRoot=System.Byte%5B%5D&IsReadOnly=False&IsFixedSize=True&IsSynchronized=False   -  person NikedLab    schedule 25.02.2013
comment
если у вас нет заголовков, то это не похоже на HTTP... HTTP имеет заголовки. Наличие заголовков не должно оказывать на него чрезмерного влияния.   -  person Marc Gravell    schedule 25.02.2013
comment
ОК, есть у меня второй клиент для сервиса, сначала пишу для андроида, теперь пишу для WP8, на андроиде HttpClient вижу не эту проблему, а на RestSharp она есть   -  person NikedLab    schedule 25.02.2013
comment
тогда вам нужно проверить http, чтобы увидеть, что именно отличается. Вы также можете просто использовать HttpClient на WP8 (nuget.org/packages/Microsoft.Net.Http?)   -  person Marc Gravell    schedule 25.02.2013
comment
В WP8 нет HttpClient, только WebClient. Но WebClient не может поместить двоичные данные. Вот почему я использую restSharp   -  person NikedLab    schedule 25.02.2013
comment
это могло бы быть более убедительным, если бы я не просто связался с предоставленной MS загрузкой HttpClient на NuGet...   -  person Marc Gravell    schedule 25.02.2013
comment
Этот пакет предоставляет программный интерфейс для современных HTTP-приложений на платформах .NET Framework 4, Silverlight 4 и 5, Windows Phone 7.5 и 8. Этот пакет включает HttpClient для отправки запросов по HTTP, а также HttpRequestMessage и HttpResponseMessage для обработки HTTP-сообщений. Этот пакет также поддерживает переносимые библиотеки классов.   -  person Marc Gravell    schedule 25.02.2013


Ответы (2)


Спасибо Марку Гравеллу. Решение:

        var client = new HttpClient();
        var httpContent = new ByteArrayContent(data);
        client.PutAsync(Path, httpContent);
person NikedLab    schedule 25.02.2013

Иногда я борюсь с этим и, наконец, нашел решение, которое магия должна дать как тело запроса без имени параметра.

// file to send
IFormFile file
byte[] buffer;

using (var ms = new MemoryStream())
using (var stream = file.OpenReadStream())
{
    stream.CopyTo(ms);
    buffer = ms.ToArray();
}
var uploadDoc = new RestRequest("ressource", Method.POST);
uploadDoc.RequestFormat = DataFormat.None;
uploadDoc.AddParameter("", buffer, ParameterType.RequestBody);

var response = new RestClient("baseUrl").Execute(uploadDoc);

надеюсь, это может помочь другим

person bobzer    schedule 10.07.2020