Можно ли отправлять запросы get / post с параметрами строки и байтового массива? - PullRequest
0 голосов
/ 04 сентября 2018

Мне нужно отправить запрос POST веб-сервису с несколькими параметрами, один из которых имеет тип byte []. Но я не знаю, как передать параметр byte []. Кто-нибудь знает? Также мне хотелось бы узнать, как отправлять массив byte [] в запросах GET. Любая помощь будет оценена!

    using (var client = new WebClient())
    {
            var values = new NameValueCollection();
            values["thing1"] = "hello";
            values["thing2"] = "world"; // how to pass byte[] here?

            var response = client.UploadValues("http://www.example.com/recepticle.aspx", values);

            var responseString = Encoding.Default.GetString(response);
     }

или другой вариант с HttpClient:

    private static readonly HttpClient client = new HttpClient();
    var values = new Dictionary<string, string>
    {
       { "thing1", "hello" },
       { "thing2", "world" } // how to pass byte[] here?
    };

    var content = new FormUrlEncodedContent(values);

    var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content);

    var responseString = await response.Content.ReadAsStringAsync();

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

@ Heretic Monkey сказал в комментариях: Ну, вы не можете передать массив byte [], если используемая вами структура является строковым значением ... если вы не используете Base 64

Может быть, в некоторых случаях вы правы, но:

Convert.ToBase64String Вы можете легко преобразовать выходную строку обратно в байтовый массив, используя Convert.FromBase64String. Примечание. Выходная строка может содержать «+», «/» и «=». Если вы хотите использовать строку в URL, вам нужно явно ее кодировать. © combo_ci

Так, иногда лучше использовать HttpServerUtility.UrlTokenEncode (byte []) и декодировать его на стороне сервера.

Но моя проблема заключалась в том, что веб-сервис не мог принимать большие файлы. И на стороне клиента я получил исключение «415: неподдерживаемый тип носителя». Это было решено путем изменения конфигурации на стороне веб-службы:

<!-- To be added under <system.web> -->
<httpRuntime targetFramework="4.5" maxRequestLength="1048576" executionTimeout="3600" />

<!-- To be added under <system.webServer> -->
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
0 голосов
/ 04 сентября 2018

У вас есть несколько вариантов:

  • Измените тип содержимого вашего запроса на двоичный формат. Это исключило бы включение любых строк.
  • Используйте формат , состоящий из нескольких частей, например RFC 1341
  • Кодируйте ваши двоичные данные, чтобы их можно было отправлять в виде строки. Base64 часто встречается.
...