c# потребление http тела без ожидания конца потока / тела - PullRequest
0 голосов
/ 25 марта 2020

Я Java разработчик

Я пытаюсь передать неизвестное количество двоичных данных от клиента к серверу по запросу http put. По какой-то причине мой сервер написан на c# (. net ядро), а для удобства мой клиент (который я использую только для тестирования) написан на java.

Как я в ожидании неизвестного количества данных и для проверки моего сервера rest api мой клиент java открывает двоичный файл и отправляет двоичный пакет по запросу HTTP put (например, 160 байт на пакет). Когда я начинаю потоковую передачу данных от клиента, я не могу использовать тело (поток http) на стороне сервера, пока клиент не завершит отправку всех двоичных пакетов.

Используемые http-заголовки: Connection-KeepAlive, Content-Type => application / octetstream, Transfer-Encoding => Chunked

Итак, я хотел бы потреблять тело, не ожидая всего тела.

Любой намек, как это выполнить?

Я думаю об удалении оператора await перед асинхронным c методом, который использует тело и ждет, пока клиент не прервет или не закроет соединение на стороне сервера, но я не знаю, хорошая ли это идея.

Ниже приведен фрагмент кода:

  • на стороне сервера, написанный на c#
[HttpPut]
        public async Task<IActionResult> SendData(string id, string device, string token){
            ...
            using (MemoryStream ms = new MemoryStream()){
                await HttpContext.Request.Body.CopyToAsync(ms);
            }
            ...
            //do stuff
        }
  • java client

    HttpURLConnection conn = (HttpURLConnection) new URL(
              "http://localhost:8080/test"
              ).openConnection();
    
      byte[] data = Files.readAllBytes(Paths.get(FILE_TO_SEND_PATH));
      ByteArrayInputStream is = new ByteArrayInputStream(data);
    
      conn.setRequestMethod("PUT");
      conn.setRequestProperty("Content-Type", "application/octet-stream");
      conn.setRequestProperty("Connection", "Keep-Alive");
      conn.setDoOutput(true);
      conn.setDoInput(true);
      conn.setChunkedStreamingMode(160);
      //conn.setFixedLengthStreamingMode(is.available());
      conn.setDefaultUseCaches(false);
      conn.setUseCaches(false);
      conn.connect();
    
      OutputStream out = conn.getOutputStream();
      //InputStream i = conn.getInputStream();
    
      byte[] bytes = new byte[160];
      int read = 0;
      while ((read = is.read(bytes)) > 0) {
           out.write(bytes, 0, read);
           System.out.println(read);
           TimeUnit.MICROSECONDS.sleep(125 * read);
           out.flush();
      }
      out.close();
    
...