HETP GET-запрос от службы WCF: почему браузеру требуется больше времени для загрузки JSON MemoryStream, чем строка JSON, созданная из того же потока? - PullRequest
0 голосов
/ 22 января 2020

Я размещаю службу WCF на IIS. Служба имеет список MyClass объектов, сериализует их (с Json. NET) от Newtonsoft в JSON и отправляет JSON клиенту. Список составляет около 1,2 МБ

Служба имеет два метода [WebGet] - первый отправляет JSON MemoryStream, второй преобразует поток в строку и затем отправляет ее.

Когда я вызываю службу из браузера (Mozilla Firefox, Microsoft Edge), загрузка MemoryStream занимает где-то от двух до десяти раз дольше, чем загрузка строки. Это почему? Это плохо написанный код с моей стороны или это нормально? В Google Chrome различия еще больше - MemoryStream загружается примерно в 50 раз длиннее строки.

Вот части кода, которые я использую:

Сервисный контракт:

    [ServiceContract]
    public interface IJsonService
    {
        [OperationContract]
        [WebGet]
        MemoryStream GetJsonStream();

        [OperationContract]
        [WebGet]
        string GetJsonString();
    }

Сам сервис:

    public class JsonService : IJsonService
    {
        public static List<MyClass> GetRandomListOfNObjects(int n)
        {
            (...)
        }

        //static field, just to make sure both jsons have the same data
        public static List<MyClass> theData = GetRandomListOfNObjects(3000);

        public MemoryStream GetJsonStream()
        {
            //serialization to JSON using Newtonsoft NuGet package
            var ser = new JsonSerializer();
            MemoryStream mem = new MemoryStream();
            using (StreamWriter stW = new StreamWriter(mem))
            {
                using (JsonWriter jsW = new JsonTextWriter(stW))
                {
                    ser.Serialize(jsW, theData);
                }
            }

            return new MemoryStream(mem.ToArray());
        }

        public string GetJsonString()
        {
            //GetJsonString method calls GetJsonStream method, yet it works faster

            MemoryStream mem = GetJsonStream();
            StreamReader srd = new StreamReader(mem);

            string ret = srd.ReadToEnd();

            return ret;
        }
    }

Оба метода размещены на IIS. Я вызываю оба метода из браузера с помощью:

http://localhost:XXXX/ProjectName/Namespace.JsonService.svc/GetJsonStream

http://localhost:XXXX/ProjectName/Namespace.JsonService.svc/GetJsonString

Кто-нибудь знает, почему MemoryStream загружается дольше, чем строка?

...