Я пытаюсь с помощью команды post отправить некоторые метаданные вместе с файлом из Java в .Net WebApi.Он отлично работает для большинства передач файлов, но у меня есть один, который не работает, и я не могу понять, почему.Я знаю, что происходит, но не знаю, как исправить проблему.
У меня есть строка json длиной 83382, но когда она попадает в .Net WebApi, ее длина только 80310 с отсутствующей первой частью строки.В упрощенном примере я отправляю 1234567890, но я получаю только 4567890 на сервере, что делает невозможным десериализацию данных перед передачей на мой контроллер.Я могу скопировать JSON в почту клиента почтальон / рестлет, и это прекрасно.Кажется, мне не хватает ключевой концепции при работе с потоками в Java, но я не могу понять, что мне нужно делать.Я знаю, что это не проблема на стороне сервера, потому что клиент рестлета прекрасно работает с точно таким же сообщением.
На стороне Java у меня есть следующее
var obj = new java.net.URL(url);
var con = obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", "Mozilla/5.0");
con.setRequestProperty("Content-Type", "application/json");
con.setDoOutput(true);
con.setDoInput(true);
con.setAllowUserInteraction(false);
var os = con.getOutputStream();
var bytesToWrite = jsonStr.getBytes();
print('bytesToWrite.length: ' + bytesToWrite.length); //returns 83382
os.write(bytesToWrite);
os.flush();
os.close();
var responseCode = con.getResponseCode();
....
На стороне .Netвнутри моего контроллера
public void Post([FromBody]SomeModel someModel) {
var stream = HttpContext.Current.Request.GetBufferedInputStream();
var rawBody = new StreamReader(stream).ReadToEnd();
var len = rawBody.Length; // returns 80310
....
someModel должен быть заполнен данными, но, поскольку поток имеет только последнюю часть данных, он равен нулю, когда он достигает метода post.Теперь я также знаю, что полное сообщение действительно приходит, потому что, если я делаю следующее
public void Post([FromBody]SomeModel someModel) {
var stream = HttpContext.Current.Request.GetBufferedInputStream();
var rawBody = new StreamReader(stream).ReadToEnd();
var len = rawBody.Length; // returns 80310
var t = new StreamReader(HttpContext.Current.Request.InputStream);
t.BaseStream.Seek(0, SeekOrigin.Begin);
rawBody = t.ReadToEnd();
var d = rawBody.Length; // returns 83382
....
Итак, я знаю, что все данные отправляются, и все они приходят на сервер, но я не знаю, почему я получаюожидаемое поведение от клиента почтальона / рестлета, но не от кода Java.