Почему StreamReader.ReadToEnd () выбрасывает. NET Core, но не. NET Framework? - PullRequest
0 голосов
/ 07 августа 2020

Мне нужно вызвать веб-службу в старой устаревшей системе, и я украл для этого код из старого приложения Silverlight (которое я не писал), предназначенного для таргетинга. NET 4. Я убедился, что код работает . Однако, когда я помещаю этот код в свое приложение targeting. NET Core 3.1, я получаю следующую ошибку при вызове ReadToEnd () в StreamReader:

System.IO.IOException: 'Ответ закончился преждевременно, с ожидается минимум 185 дополнительных байтов. '

Я создал два идентичных консольных приложения, одно для таргетинга. NET 4.7, другое для таргетинга. NET Core 3.1, и, конечно же, оно работало на 4.7, но не на Core 3.1. Я знаю, что кодовая страница 1252 не поддерживается в. net Core, и я поигрался с другими значениями, чтобы убедиться, что это не проблема.

Я нашел то, что я бы назвал хакерским обходным путем, вращая его побайтно и используя метод Peek () (ReadLine () тоже не работает), поэтому я знаю, что на самом деле получаю данные обратно, но надеюсь, что блестящие умы помогут мне понять 1) почему ReadToEnd () добавляется. NET Core и 2) есть ли лучший способ сделать это, имея в виду, что у меня нет контроля над веб-службой в устаревшей системе.

Заранее благодарим за вашу помощь !

WebRequest requestGetPODetails = WebRequest.Create(myURL);
requestGetPODetails.Method = "POST";

var postContentsBuffer = Encoding.GetEncoding(1252).GetBytes(someXML);
requestGetPODetails.ContentLength = postContentsBuffer.Length;
using (Stream sfdDataStream = requestGetPODetails.GetRequestStream())
    sfdDataStream.Write(postContentsBuffer, 0, postContentsBuffer.Length);

// Retrieve the results
using (WebResponse responseGetPODetails = requestGetPODetails.GetResponse())
{
    Encoding enc = Encoding.GetEncoding(1252);
    using (StreamReader sfdDataStreamReader = new StreamReader(responseGetPODetails.GetResponseStream(), enc))
    {
        string stringResponse = sfdDataStreamReader.ReadToEnd(); // Error occurs here in .NET Core
    }
}

1 Ответ

0 голосов
/ 07 августа 2020

Огромное спасибо Алексею Левенкову! Вы были совершенно правы - сервис неверно сообщал длину потока. Я обратился к старому разработчику, и он смог исправить это, и теперь все в порядке.

Странно то, что это работало под. NET Framework, но не Core, поэтому что-то явно изменилось с Core as теперь он заботится о том, чтобы длина сообщалась точно.

Еще раз спасибо!

...