Как читать сжатые данные в запросе post / put (сторона API) - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь уменьшить размер запроса, сжимая данные с помощью gZip.У меня есть рабочий запрос post / put, отправленный как json, и я хотел бы отправить им gZip.

Для сервера к клиенту, я получил его с:

services.AddResponseCompression(o =>
{
    o.Providers.Add<GzipCompressionProvider>();
});
app.UseResponseCompression();

и дляклиент-сервер так, как я не могу заставить его работать.Я добавил следующие методы соответствия:

private static byte[] Zip(string str)
{
    var bytes = Encoding.UTF8.GetBytes(str);

    using (var msi = new MemoryStream(bytes))
    using (var mso = new MemoryStream())
    {
        using (var gs = new GZipStream(mso, CompressionMode.Compress))
        {
            //msi.CopyTo(gs);
            CopyTo(msi, gs);
        }

        return mso.ToArray();
    }
}


private static void CopyTo(Stream src, Stream dest)
{
    var bytes = new byte[4096];

    int cnt;

    while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0) dest.Write(bytes, 0, cnt);
}

и отправляю запрос следующим образом:

internal static async Task<object> PostAsync(string request, object value, string token = null)
{

    //Create the http client to send the request
    using (var client = new HttpClient())
    {
        //Add the token from the user
        if (!string.IsNullOrEmpty(token))
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));

        var serializedValues = SerializeSplitter(value);
        var output = new List<bool>();
        //Wait for the server response
        foreach (var serializedValue in serializedValues)
        {

            var response = await client
                .PostAsync(Host + request, new StringContent(Encoding.UTF8.GetString(Zip(serializedValue)), Encoding.UTF8, "application/json"))
                .ConfigureAwait(false);
            output.Add(response.IsSuccessStatusCode);
        }

        //TODO Add error manager

        return output.All(i => i);
    }
}

Когда я отправляю запрос, я получаю BadRequest 400:

{
    "errors": {
        "": [
            "Unexpected character encountered while parsing value: \u001f. Path '', line 0, position 0."
        ]
    },
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "0HLN405BDHU0T:00000001"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...