Java getOutputStream для .Net WebApi - PullRequest
       5

Java getOutputStream для .Net WebApi

0 голосов
/ 11 октября 2018

Я пытаюсь с помощью команды 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.

...